move around - flatter.
[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_list_append(lay->objects, 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_list_remove(obj->layer->objects, 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_List *l;
56
57    for (l = (Evas_Object_List *)lay->objects; l; l = l->next)
58      {
59         Evas_Object *obj;
60
61         obj = (Evas_Object *)l;
62         if ((!obj->smart.parent) && (!obj->delete_me))
63           evas_object_del(obj);
64      }
65 }
66
67 void
68 evas_layer_free(Evas_Layer *lay)
69 {
70    while (lay->objects)
71      {
72         Evas_Object *obj;
73
74         obj = (Evas_Object *)lay->objects;
75         evas_object_free(obj, 0);
76      }
77    free(lay);
78 }
79
80 Evas_Layer *
81 evas_layer_find(Evas *e, short layer_num)
82 {
83    Evas_Object_List *list;
84
85    for (list = (Evas_Object_List *)e->layers; list; list = list->next)
86      {
87         Evas_Layer *layer;
88
89         layer = (Evas_Layer *)list;
90         if (layer->layer == layer_num) return layer;
91      }
92    return NULL;
93 }
94
95 void
96 evas_layer_add(Evas_Layer *lay)
97 {
98    Evas_Object_List *list;
99
100    for (list = (Evas_Object_List *)lay->evas->layers; list; list = list->next)
101      {
102         Evas_Layer *layer;
103
104         layer = (Evas_Layer *)list;
105         if (layer->layer > lay->layer)
106           {
107              lay->evas->layers = evas_object_list_prepend_relative(lay->evas->layers, lay, layer);
108              return;
109           }
110      }
111    lay->evas->layers = evas_object_list_append(lay->evas->layers, lay);
112 }
113
114 void
115 evas_layer_del(Evas_Layer *lay)
116 {
117    Evas_Object_List *ol;
118    Evas *e;
119
120    ol = (Evas_Object_List *)lay;
121    e = lay->evas;
122    e->layers = evas_object_list_remove(e->layers, lay);
123 }
124
125 /* public functions */
126
127 /**
128  * @defgroup Evas_Object_Layer_Group Object Layer Functions
129  *
130  * Functions that retrieve and set the layer that an evas object is on.
131  *
132  * @todo Document which way layers go.
133  */
134
135 /**
136  * Sets the layer of the evas that the given object will be part of.
137  * @param   obj The given evas object.
138  * @param   l   The number of the layer to place the object on.
139  * @ingroup Evas_Object_Layer_Group
140  */
141 EAPI void
142 evas_object_layer_set(Evas_Object *obj, short l)
143 {
144    Evas *e;
145
146    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
147    return;
148    MAGIC_CHECK_END();
149    if (evas_object_intercept_call_layer_set(obj, l)) return;
150    if (obj->smart.parent) return;
151    if (obj->cur.layer == l)
152      {
153         evas_object_raise(obj);
154         return;
155      }
156    e = obj->layer->evas;
157    evas_object_release(obj, 1);
158    obj->cur.layer = l;
159    evas_object_inject(obj, e);
160    obj->restack = 1;
161    evas_object_change(obj);
162    if (obj->clip.clipees)
163      {
164         evas_object_inform_call_restack(obj);
165         return;
166      }
167    evas_object_change(obj);
168    if (!obj->smart.smart)
169      {
170         if (evas_object_is_in_output_rect(obj,
171                                           obj->layer->evas->pointer.x,
172                                           obj->layer->evas->pointer.y, 1, 1) &&
173             obj->cur.visible)
174           if (evas_list_find(obj->layer->evas->pointer.object.in, obj))
175             evas_event_feed_mouse_move(obj->layer->evas,
176                                        obj->layer->evas->pointer.x,
177                                        obj->layer->evas->pointer.y,
178                                        obj->layer->evas->last_timestamp,
179                                        NULL);
180      }
181    evas_object_inform_call_restack(obj);
182 }
183
184 /**
185  * Retrieves the layer of the evas that the given object is part of.
186  * @param   obj The given evas object.
187  * @return  Number of the layer.
188  * @ingroup Evas_Object_Layer_Group
189  */
190 EAPI short
191 evas_object_layer_get(const Evas_Object *obj)
192 {
193    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
194    return 0;
195    MAGIC_CHECK_END();
196    if (obj->smart.parent)
197      {
198         return obj->smart.parent->cur.layer;
199      }
200    return obj->cur.layer;
201 }