Rename EINA_INLIST_ITER_NEXT/EINA_INLIST_ITER_LAST to EINA_INLIST_FOREACH/
[profile/ivi/evas.git] / src / lib / canvas / evas_layer.c
1 #include "evas_common.h"
2 #include "evas_private.h"
3
4 void
5 evas_object_inject(Evas_Object *obj, Evas *e)
6 {
7    Evas_Layer *lay;
8
9    if (obj->in_layer) return;
10    lay = evas_layer_find(e, obj->cur.layer);
11    if (!lay)
12      {
13         lay = evas_layer_new(e);
14         lay->layer = obj->cur.layer;
15         evas_layer_add(lay);
16      }
17    lay->objects = (Evas_Object *)eina_inlist_append(EINA_INLIST_GET(lay->objects), EINA_INLIST_GET(obj));
18    lay->usage++;
19    obj->layer = lay;
20    obj->in_layer = 1;
21 }
22
23 void
24 evas_object_release(Evas_Object *obj, int clean_layer)
25 {
26    if (!obj->in_layer) return;
27    obj->layer->objects = (Evas_Object *)eina_inlist_remove(EINA_INLIST_GET(obj->layer->objects), EINA_INLIST_GET(obj));
28    obj->layer->usage--;
29    if (clean_layer)
30      {
31         if (obj->layer->usage <= 0)
32           {
33              evas_layer_del(obj->layer);
34              evas_layer_free(obj->layer);
35           }
36      }
37    obj->layer = NULL;
38    obj->in_layer = 0;
39 }
40
41 Evas_Layer *
42 evas_layer_new(Evas *e)
43 {
44    Evas_Layer *lay;
45
46    lay = calloc(1, sizeof(Evas_Layer));
47    if (!lay) return NULL;
48    lay->evas = e;
49    return lay;
50 }
51
52 void
53 evas_layer_pre_free(Evas_Layer *lay)
54 {
55    Evas_Object *obj;
56
57    EINA_INLIST_FOREACH(lay->objects, obj)
58      {
59         if ((!obj->smart.parent) && (!obj->delete_me))
60           evas_object_del(obj);
61      }
62 }
63
64 void
65 evas_layer_free(Evas_Layer *lay)
66 {
67    while (lay->objects)
68      {
69         Evas_Object *obj;
70
71         obj = (Evas_Object *)lay->objects;
72         evas_object_free(obj, 0);
73      }
74    free(lay);
75 }
76
77 Evas_Layer *
78 evas_layer_find(Evas *e, short layer_num)
79 {
80    Evas_Layer *layer;
81
82    EINA_INLIST_FOREACH(e->layers, layer)
83      {
84         if (layer->layer == layer_num) return layer;
85      }
86    return NULL;
87 }
88
89 void
90 evas_layer_add(Evas_Layer *lay)
91 {
92    Evas_Layer *layer;
93
94    EINA_INLIST_FOREACH(lay->evas->layers, layer)
95      {
96         if (layer->layer > lay->layer)
97           {
98              lay->evas->layers = (Evas_Layer *)eina_inlist_prepend_relative(EINA_INLIST_GET(lay->evas->layers),
99                                                                             EINA_INLIST_GET(lay),
100                                                                             EINA_INLIST_GET(layer));
101              return;
102           }
103      }
104    lay->evas->layers = (Evas_Layer *)eina_inlist_append(EINA_INLIST_GET(lay->evas->layers), EINA_INLIST_GET(lay));
105 }
106
107 void
108 evas_layer_del(Evas_Layer *lay)
109 {
110    Evas *e;
111
112    e = lay->evas;
113    e->layers = (Evas_Layer *)eina_inlist_remove(EINA_INLIST_GET(e->layers), EINA_INLIST_GET(lay));
114 }
115
116 /* public functions */
117
118 /**
119  * @defgroup Evas_Object_Layer_Group Object Layer Functions
120  *
121  * Functions that retrieve and set the layer that an evas object is on.
122  *
123  * @todo Document which way layers go.
124  */
125
126 /**
127  * Sets the layer of the evas that the given object will be part of.
128  * @param   obj The given evas object.
129  * @param   l   The number of the layer to place the object on.
130  * @ingroup Evas_Object_Layer_Group
131  */
132 EAPI void
133 evas_object_layer_set(Evas_Object *obj, short l)
134 {
135    Evas *e;
136
137    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
138    return;
139    MAGIC_CHECK_END();
140    if (evas_object_intercept_call_layer_set(obj, l)) return;
141    if (obj->smart.parent) return;
142    if (obj->cur.layer == l)
143      {
144         evas_object_raise(obj);
145         return;
146      }
147    e = obj->layer->evas;
148    evas_object_release(obj, 1);
149    obj->cur.layer = l;
150    evas_object_inject(obj, e);
151    obj->restack = 1;
152    evas_object_change(obj);
153    if (obj->clip.clipees)
154      {
155         evas_object_inform_call_restack(obj);
156         return;
157      }
158    evas_object_change(obj);
159    if (!obj->smart.smart)
160      {
161         if (evas_object_is_in_output_rect(obj,
162                                           obj->layer->evas->pointer.x,
163                                           obj->layer->evas->pointer.y, 1, 1) &&
164             obj->cur.visible)
165           if (evas_list_find(obj->layer->evas->pointer.object.in, obj))
166             evas_event_feed_mouse_move(obj->layer->evas,
167                                        obj->layer->evas->pointer.x,
168                                        obj->layer->evas->pointer.y,
169                                        obj->layer->evas->last_timestamp,
170                                        NULL);
171      }
172    evas_object_inform_call_restack(obj);
173 }
174
175 /**
176  * Retrieves the layer of the evas that the given object is part of.
177  * @param   obj The given evas object.
178  * @return  Number of the layer.
179  * @ingroup Evas_Object_Layer_Group
180  */
181 EAPI short
182 evas_object_layer_get(const Evas_Object *obj)
183 {
184    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
185    return 0;
186    MAGIC_CHECK_END();
187    if (obj->smart.parent)
188      {
189         return obj->smart.parent->cur.layer;
190      }
191    return obj->cur.layer;
192 }