aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/edje/src/lib/edje_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/edje/src/lib/edje_main.c')
-rw-r--r--libraries/edje/src/lib/edje_main.c274
1 files changed, 274 insertions, 0 deletions
diff --git a/libraries/edje/src/lib/edje_main.c b/libraries/edje/src/lib/edje_main.c
new file mode 100644
index 0000000..cf443c7
--- /dev/null
+++ b/libraries/edje/src/lib/edje_main.c
@@ -0,0 +1,274 @@
1#include "edje_private.h"
2
3static Edje_Version _version = { VMAJ, VMIN, VMIC, VREV };
4EAPI Edje_Version *edje_version = &_version;
5
6static int _edje_init_count = 0;
7int _edje_default_log_dom = -1;
8Eina_Mempool *_edje_real_part_mp = NULL;
9Eina_Mempool *_edje_real_part_state_mp = NULL;
10
11/*============================================================================*
12 * API *
13 *============================================================================*/
14
15
16EAPI int
17edje_init(void)
18{
19 if (++_edje_init_count != 1)
20 return _edje_init_count;
21
22 srand(time(NULL));
23
24 if (!eina_init())
25 {
26 fprintf(stderr, "Edje: Eina init failed");
27 return --_edje_init_count;
28 }
29
30 _edje_default_log_dom = eina_log_domain_register
31 ("edje", EDJE_DEFAULT_LOG_COLOR);
32 if (_edje_default_log_dom < 0)
33 {
34 EINA_LOG_ERR("Edje Can not create a general log domain.");
35 goto shutdown_eina;
36 }
37
38 if (!ecore_init())
39 {
40 ERR("Ecore init failed");
41 goto unregister_log_domain;
42 }
43
44 if (!embryo_init())
45 {
46 ERR("Embryo init failed");
47 goto shutdown_ecore;
48 }
49
50 if (!eet_init())
51 {
52 ERR("Eet init failed");
53 goto shutdown_embryo;
54 }
55
56 _edje_scale = FROM_DOUBLE(1.0);
57
58 _edje_edd_init();
59 _edje_text_init();
60 _edje_box_init();
61 _edje_external_init();
62 _edje_module_init();
63 _edje_message_init();
64 _edje_multisense_init();
65
66 _edje_real_part_mp = eina_mempool_add("chained_mempool",
67 "Edje_Real_Part", NULL,
68 sizeof (Edje_Real_Part), 128);
69 if (!_edje_real_part_mp)
70 {
71 ERR("Mempool for Edje_Real_Part cannot be allocated.");
72 goto shutdown_eet;
73 }
74
75 _edje_real_part_state_mp = eina_mempool_add("chained_mempool",
76 "Edje_Real_Part_State", NULL,
77 sizeof (Edje_Real_Part_State), 256);
78 if (!_edje_real_part_state_mp)
79 {
80 ERR("Mempool for Edje_Real_Part_State cannot be allocated.");
81 goto shutdown_eet;
82 }
83
84 return _edje_init_count;
85
86 shutdown_eet:
87 eina_mempool_del(_edje_real_part_state_mp);
88 eina_mempool_del(_edje_real_part_mp);
89 _edje_real_part_state_mp = NULL;
90 _edje_real_part_mp = NULL;
91 _edje_message_shutdown();
92 _edje_module_shutdown();
93 _edje_external_shutdown();
94 _edje_box_shutdown();
95 _edje_text_class_members_free();
96 _edje_text_class_hash_free();
97 _edje_edd_shutdown();
98 eet_shutdown();
99 shutdown_embryo:
100 embryo_shutdown();
101 shutdown_ecore:
102 ecore_shutdown();
103 unregister_log_domain:
104 eina_log_domain_unregister(_edje_default_log_dom);
105 _edje_default_log_dom = -1;
106 shutdown_eina:
107 eina_shutdown();
108 return --_edje_init_count;
109}
110
111static int _edje_users = 0;
112
113static void
114_edje_shutdown_core(void)
115{
116 if (_edje_users > 0) return;
117
118 _edje_file_cache_shutdown();
119 _edje_color_class_members_free();
120 _edje_color_class_hash_free();
121
122 eina_mempool_del(_edje_real_part_state_mp);
123 eina_mempool_del(_edje_real_part_mp);
124 _edje_real_part_state_mp = NULL;
125 _edje_real_part_mp = NULL;
126
127 _edje_multisense_shutdown();
128 _edje_message_shutdown();
129 _edje_module_shutdown();
130 _edje_external_shutdown();
131 _edje_box_shutdown();
132 _edje_text_class_members_free();
133 _edje_text_class_hash_free();
134 _edje_edd_shutdown();
135
136 eet_shutdown();
137 embryo_shutdown();
138 ecore_shutdown();
139 eina_log_domain_unregister(_edje_default_log_dom);
140 _edje_default_log_dom = -1;
141 eina_shutdown();
142}
143
144void
145_edje_lib_ref(void)
146{
147 _edje_users++;
148}
149
150void
151_edje_lib_unref(void)
152{
153 _edje_users--;
154 if (_edje_users != 0) return;
155 if (_edje_init_count == 0) _edje_shutdown_core();
156}
157
158EAPI int
159edje_shutdown(void)
160{
161 if (--_edje_init_count != 0)
162 return _edje_init_count;
163
164 if (_edje_timer)
165 ecore_animator_del(_edje_timer);
166 _edje_timer = NULL;
167
168 _edje_shutdown_core();
169
170 return _edje_init_count;
171}
172
173/* Private Routines */
174static Eina_Bool
175_class_member_free(const Eina_Hash *hash __UNUSED__,
176 const void *key,
177 void *data,
178 void *fdata)
179{
180 void (*_edje_class_member_direct_del)(const char *class, void *l) = fdata;
181
182 _edje_class_member_direct_del(key, data);
183 return EINA_TRUE;
184}
185
186void
187_edje_del(Edje *ed)
188{
189 Edje_Running_Program *runp;
190 Edje_Pending_Program *pp;
191 Edje_Signal_Callback *escb;
192 Edje_Color_Class *cc;
193 Edje_Text_Class *tc;
194 Edje_Text_Insert_Filter_Callback *cb;
195
196 if (ed->processing_messages)
197 {
198 ed->delete_me = 1;
199 return;
200 }
201 _edje_message_del(ed);
202 _edje_callbacks_patterns_clean(ed);
203 _edje_file_del(ed);
204 if (ed->path) eina_stringshare_del(ed->path);
205 if (ed->group) eina_stringshare_del(ed->group);
206 if (ed->parent) eina_stringshare_del(ed->parent);
207 ed->path = NULL;
208 ed->group = NULL;
209 if ((ed->actions) || (ed->pending_actions))
210 {
211 _edje_animators = eina_list_remove(_edje_animators, ed);
212 }
213 EINA_LIST_FREE(ed->actions, runp)
214 free(runp);
215 EINA_LIST_FREE(ed->pending_actions, pp)
216 free(pp);
217 EINA_LIST_FREE(ed->callbacks, escb)
218 {
219 if (escb->signal) eina_stringshare_del(escb->signal);
220 if (escb->source) eina_stringshare_del(escb->source);
221 free(escb);
222 }
223 EINA_LIST_FREE(ed->color_classes, cc)
224 {
225 if (cc->name) eina_stringshare_del(cc->name);
226 free(cc);
227 }
228 EINA_LIST_FREE(ed->text_classes, tc)
229 {
230 if (tc->name) eina_stringshare_del(tc->name);
231 if (tc->font) eina_stringshare_del(tc->font);
232 free(tc);
233 }
234 EINA_LIST_FREE(ed->text_insert_filter_callbacks, cb)
235 {
236 eina_stringshare_del(cb->part);
237 free(cb);
238 }
239
240 if (ed->members.text_class)
241 {
242 eina_hash_foreach(ed->members.text_class, _class_member_free, _edje_text_class_member_direct_del);
243 eina_hash_free(ed->members.text_class);
244 }
245 if (ed->members.color_class)
246 {
247 eina_hash_foreach(ed->members.color_class, _class_member_free, _edje_color_class_member_direct_del);
248 eina_hash_free(ed->members.color_class);
249 }
250 free(ed);
251}
252
253void
254_edje_clean_objects(Edje *ed)
255{
256 evas_object_del(ed->base.clipper);
257 ed->base.evas = NULL;
258 ed->obj = NULL;
259 ed->base.clipper = NULL;
260}
261
262void
263_edje_ref(Edje *ed)
264{
265 if (ed->references <= 0) return;
266 ed->references++;
267}
268
269void
270_edje_unref(Edje *ed)
271{
272 ed->references--;
273 if (ed->references == 0) _edje_del(ed);
274}