diff options
Diffstat (limited to 'libraries/edje/src/lib/edje_main.c')
-rw-r--r-- | libraries/edje/src/lib/edje_main.c | 274 |
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 | |||
3 | static Edje_Version _version = { VMAJ, VMIN, VMIC, VREV }; | ||
4 | EAPI Edje_Version *edje_version = &_version; | ||
5 | |||
6 | static int _edje_init_count = 0; | ||
7 | int _edje_default_log_dom = -1; | ||
8 | Eina_Mempool *_edje_real_part_mp = NULL; | ||
9 | Eina_Mempool *_edje_real_part_state_mp = NULL; | ||
10 | |||
11 | /*============================================================================* | ||
12 | * API * | ||
13 | *============================================================================*/ | ||
14 | |||
15 | |||
16 | EAPI int | ||
17 | edje_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 | |||
111 | static int _edje_users = 0; | ||
112 | |||
113 | static 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 | |||
144 | void | ||
145 | _edje_lib_ref(void) | ||
146 | { | ||
147 | _edje_users++; | ||
148 | } | ||
149 | |||
150 | void | ||
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 | |||
158 | EAPI int | ||
159 | edje_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 */ | ||
174 | static 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 | |||
186 | void | ||
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 | |||
253 | void | ||
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 | |||
262 | void | ||
263 | _edje_ref(Edje *ed) | ||
264 | { | ||
265 | if (ed->references <= 0) return; | ||
266 | ed->references++; | ||
267 | } | ||
268 | |||
269 | void | ||
270 | _edje_unref(Edje *ed) | ||
271 | { | ||
272 | ed->references--; | ||
273 | if (ed->references == 0) _edje_del(ed); | ||
274 | } | ||