1 #include "edje_private.h"
3 static Edje_Version _version = { VMAJ, VMIN, VMIC, VREV };
4 EAPI Edje_Version *edje_version = &_version;
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;
11 /*============================================================================*
13 *============================================================================*/
19 if (++_edje_init_count != 1)
20 return _edje_init_count;
25 return --_edje_init_count;
27 _edje_default_log_dom = eina_log_domain_register
28 ("edje", EDJE_DEFAULT_LOG_COLOR);
29 if (_edje_default_log_dom < 0)
31 EINA_LOG_ERR("Edje Can not create a general log domain.");
37 ERR("Ecore init failed");
38 goto unregister_log_domain;
43 ERR("Embryo init failed");
49 ERR("Eet init failed");
56 ERR("Eio init failed");
61 _edje_scale = FROM_DOUBLE(1.0);
66 _edje_external_init();
69 _edje_multisense_init();
71 _edje_real_part_mp = eina_mempool_add("chained_mempool",
72 "Edje_Real_Part", NULL,
73 sizeof (Edje_Real_Part), 32);
74 if (!_edje_real_part_mp)
76 ERR("Mempool for Edje_Real_Part cannot be allocated.");
80 _edje_real_part_state_mp = eina_mempool_add("chained_mempool",
81 "Edje_Real_Part_State", NULL,
82 sizeof (Edje_Real_Part_State), 32);
83 if (!_edje_real_part_state_mp)
85 ERR("Mempool for Edje_Real_Part_State cannot be allocated.");
89 return _edje_init_count;
92 eina_mempool_del(_edje_real_part_state_mp);
93 eina_mempool_del(_edje_real_part_mp);
94 _edje_real_part_state_mp = NULL;
95 _edje_real_part_mp = NULL;
96 _edje_message_shutdown();
97 _edje_module_shutdown();
98 _edje_external_shutdown();
100 _edje_text_class_members_free();
101 _edje_text_class_hash_free();
102 _edje_edd_shutdown();
112 unregister_log_domain:
113 eina_log_domain_unregister(_edje_default_log_dom);
114 _edje_default_log_dom = -1;
117 return --_edje_init_count;
120 static int _edje_users = 0;
123 _edje_shutdown_core(void)
125 if (_edje_users > 0) return;
127 _edje_file_cache_shutdown();
128 _edje_color_class_members_free();
129 _edje_color_class_hash_free();
131 eina_mempool_del(_edje_real_part_state_mp);
132 eina_mempool_del(_edje_real_part_mp);
133 _edje_real_part_state_mp = NULL;
134 _edje_real_part_mp = NULL;
136 _edje_multisense_shutdown();
137 _edje_message_shutdown();
138 _edje_module_shutdown();
139 _edje_external_shutdown();
140 _edje_box_shutdown();
141 _edje_text_class_members_free();
142 _edje_text_class_hash_free();
143 _edje_edd_shutdown();
151 eina_log_domain_unregister(_edje_default_log_dom);
152 _edje_default_log_dom = -1;
163 _edje_lib_unref(void)
166 if (_edje_users != 0) return;
167 if (_edje_init_count == 0) _edje_shutdown_core();
173 if (_edje_init_count <= 0)
175 ERR("Init count not greater than 0 in shutdown.");
178 if (--_edje_init_count != 0)
179 return _edje_init_count;
182 ecore_animator_del(_edje_timer);
185 _edje_shutdown_core();
187 return _edje_init_count;
190 /* Private Routines */
192 _class_member_free(Eina_Hash *hash,
193 void (*_edje_class_member_direct_del)(const char *class, void *l))
195 const char *color_class;
197 Eina_List *class_kill = NULL;
201 it = eina_hash_iterator_key_new(hash);
202 EINA_ITERATOR_FOREACH(it, color_class)
203 class_kill = eina_list_append(class_kill, color_class);
204 eina_iterator_free(it);
205 EINA_LIST_FREE(class_kill, color_class)
209 l = eina_hash_find(hash, color_class);
210 _edje_class_member_direct_del(color_class, l);
212 eina_hash_free(hash);
219 Edje_Running_Program *runp;
220 Edje_Pending_Program *pp;
221 Edje_Signal_Callback *escb;
223 Edje_Text_Insert_Filter_Callback *cb;
225 if (ed->processing_messages)
230 _edje_message_del(ed);
231 _edje_callbacks_patterns_clean(ed);
233 if (ed->path) eina_stringshare_del(ed->path);
234 if (ed->group) eina_stringshare_del(ed->group);
235 if (ed->parent) eina_stringshare_del(ed->parent);
238 if ((ed->actions) || (ed->pending_actions))
240 _edje_animators = eina_list_remove(_edje_animators, ed);
242 EINA_LIST_FREE(ed->actions, runp)
244 EINA_LIST_FREE(ed->pending_actions, pp)
246 EINA_LIST_FREE(ed->callbacks, escb)
248 if (escb->signal) eina_stringshare_del(escb->signal);
249 if (escb->source) eina_stringshare_del(escb->source);
252 eina_hash_free(ed->color_classes);
253 EINA_LIST_FREE(ed->text_classes, tc)
255 if (tc->name) eina_stringshare_del(tc->name);
256 if (tc->font) eina_stringshare_del(tc->font);
259 EINA_LIST_FREE(ed->text_insert_filter_callbacks, cb)
261 eina_stringshare_del(cb->part);
264 EINA_LIST_FREE(ed->markup_filter_callbacks, cb)
266 eina_stringshare_del(cb->part);
270 _class_member_free(ed->members.text_class, _edje_text_class_member_direct_del);
271 _class_member_free(ed->members.color_class, _edje_color_class_member_direct_del);
276 _edje_clean_objects(Edje *ed)
278 evas_object_del(ed->base.clipper);
279 ed->base.evas = NULL;
281 ed->base.clipper = NULL;
287 if (ed->references <= 0) return;
292 _edje_unref(Edje *ed)
295 if (ed->references == 0) _edje_del(ed);