* remove \'too small\' categories
[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  * @addtogroup Evas_Object_Group
120  * @{
121  */
122
123 /**
124  * Sets the layer of the evas that the given object will be part of.
125  * @param   obj The given evas object.
126  * @param   l   The number of the layer to place the object on.
127  */
128 EAPI void
129 evas_object_layer_set(Evas_Object *obj, short l)
130 {
131    Evas *e;
132
133    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
134    return;
135    MAGIC_CHECK_END();
136    if (evas_object_intercept_call_layer_set(obj, l)) return;
137    if (obj->smart.parent) return;
138    if (obj->cur.layer == l)
139      {
140         evas_object_raise(obj);
141         return;
142      }
143    e = obj->layer->evas;
144    evas_object_release(obj, 1);
145    obj->cur.layer = l;
146    evas_object_inject(obj, e);
147    obj->restack = 1;
148    evas_object_change(obj);
149    if (obj->clip.clipees)
150      {
151         evas_object_inform_call_restack(obj);
152         return;
153      }
154    evas_object_change(obj);
155    if (!obj->smart.smart)
156      {
157         if (evas_object_is_in_output_rect(obj,
158                                           obj->layer->evas->pointer.x,
159                                           obj->layer->evas->pointer.y, 1, 1) &&
160             obj->cur.visible)
161           if (eina_list_data_find(obj->layer->evas->pointer.object.in, obj))
162             evas_event_feed_mouse_move(obj->layer->evas,
163                                        obj->layer->evas->pointer.x,
164                                        obj->layer->evas->pointer.y,
165                                        obj->layer->evas->last_timestamp,
166                                        NULL);
167      }
168    evas_object_inform_call_restack(obj);
169 }
170
171 /**
172  * Retrieves the layer of the evas that the given object is part of.
173  * @param   obj The given evas object.
174  * @return  Number of the layer.
175  */
176 EAPI short
177 evas_object_layer_get(const Evas_Object *obj)
178 {
179    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
180    return 0;
181    MAGIC_CHECK_END();
182    if (obj->smart.parent)
183      {
184         return obj->smart.parent->cur.layer;
185      }
186    return obj->cur.layer;
187 }
188
189 /**
190  * @}
191  */