1 #include "edje_private.h"
3 typedef struct _Edje_Box_Layout Edje_Box_Layout;
4 struct _Edje_Box_Layout
7 Evas_Object_Box_Layout func;
8 void *(*layout_data_get)(void *);
9 void (*layout_data_free)(void *);
11 void (*free_data)(void *);
15 static Eina_Hash *_edje_color_class_hash = NULL;
16 static Eina_Hash *_edje_color_class_member_hash = NULL;
18 static Eina_Hash *_edje_text_class_hash = NULL;
19 static Eina_Hash *_edje_text_class_member_hash = NULL;
21 static Eina_Rbtree *_edje_box_layout_registry = NULL;
23 char *_edje_fontset_append = NULL;
24 FLOAT_T _edje_scale = ZERO;
25 Eina_Bool _edje_password_show_last = EINA_FALSE;
26 FLOAT_T _edje_password_show_last_timeout = ZERO;
27 int _edje_freeze_val = 0;
28 int _edje_freeze_calc_count = 0;
29 Eina_List *_edje_freeze_calc_list = NULL;
31 typedef struct _Edje_List_Foreach_Data Edje_List_Foreach_Data;
32 struct _Edje_List_Foreach_Data
37 typedef struct _Edje_List_Refcount Edje_List_Refcount;
38 struct _Edje_List_Refcount
45 static Eina_Bool _edje_color_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
46 static Eina_Bool _edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
47 static void _edje_object_image_preload_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
48 static void _edje_object_signal_preload_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
50 Edje_Real_Part *_edje_real_part_recursive_get_helper(const Edje *ed, char **path);
54 _edje_class_member_direct_del(const char *class, Edje_List_Refcount *lookup, Eina_Hash *hash)
58 members = eina_hash_find(hash, class);
59 members = eina_list_remove_list(members, lookup->lookup);
60 eina_hash_set(hash, class, members);
65 _edje_class_member_add(Edje *ed, Eina_Hash **ehash, Eina_Hash **ghash, const char *class)
67 Edje_List_Refcount *lookup;
70 if ((!ed) || (!ehash) || (!ghash) || (!class)) return;
72 lookup = eina_hash_find(*ehash, class);
75 EINA_REFCOUNT_REF(lookup);
79 lookup = malloc(sizeof (Edje_List_Refcount));
81 EINA_REFCOUNT_INIT(lookup);
83 /* Get members list */
84 members = eina_hash_find(*ghash, class);
86 /* Update the member list */
87 lookup->lookup = members = eina_list_prepend(members, ed);
89 /* Don't loose track of members list */
91 *ehash = eina_hash_string_small_new(NULL);
92 eina_hash_add(*ehash, class, lookup);
94 /* Reset the member list to the right pointer */
96 *ghash = eina_hash_string_superfast_new(NULL);
97 eina_hash_set(*ghash, class, members);
101 _edje_class_member_del(Eina_Hash **ehash, Eina_Hash **ghash, const char *class)
103 Edje_List_Refcount *lookup;
106 if ((!ehash) || (!ghash) || (!class)) return;
107 members = eina_hash_find(*ghash, class);
108 if (!members) return;
110 lookup = eina_hash_find(*ehash, class);
111 if (!lookup) return ;
113 EINA_REFCOUNT_UNREF(lookup)
115 members = eina_list_remove_list(members, lookup->lookup);
116 eina_hash_set(*ghash, class, members);
118 eina_hash_del(*ehash, class, lookup);
124 member_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
126 eina_list_free(data);
131 _edje_class_members_free(Eina_Hash **ghash)
133 if (!ghash || !*ghash) return;
134 eina_hash_foreach(*ghash, member_list_free, NULL);
135 eina_hash_free(*ghash);
139 /************************** API Routines **************************/
148 INF("fr ++ ->%i", _edje_freeze_val);
150 // FIXME: could just have a global freeze instead of per object
151 // above i tried.. but this broke some things. notable e17's menus. why?
155 EINA_LIST_FOREACH(_edje_edjes, l, data)
156 edje_object_freeze(data);
162 _edje_thaw_edje(Edje *ed)
166 for (i = 0; i < ed->table_parts_size; i++)
170 rp = ed->table_parts[i];
171 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
175 ed2 = _edje_fetch(rp->swallowed_object);
176 if (ed2) _edje_thaw_edje(ed2);
179 if ((ed->recalc) && (ed->freeze <= 0)) _edje_recalc_do(ed);
188 INF("fr -- ->%i", _edje_freeze_val);
189 if ((_edje_freeze_val <= 0) && (_edje_freeze_calc_count > 0))
193 _edje_freeze_calc_count = 0;
194 EINA_LIST_FREE(_edje_freeze_calc_list, ed)
203 // FIXME: could just have a global freeze instead of per object
204 // comment as above.. why?
207 EINA_LIST_FOREACH(_edje_edjes, l, data)
208 edje_object_thaw(data);
213 edje_fontset_append_set(const char *fonts)
215 if (_edje_fontset_append)
216 free(_edje_fontset_append);
217 _edje_fontset_append = fonts ? strdup(fonts) : NULL;
221 edje_fontset_append_get(void)
223 return _edje_fontset_append;
227 edje_scale_set(double scale)
232 if (_edje_scale == FROM_DOUBLE(scale)) return;
233 _edje_scale = FROM_DOUBLE(scale);
234 EINA_LIST_FOREACH(_edje_edjes, l, data)
235 edje_object_calc_force(data);
241 return TO_DOUBLE(_edje_scale);
245 edje_password_show_last_set(Eina_Bool password_show_last)
247 if (_edje_password_show_last == password_show_last) return;
248 _edje_password_show_last = password_show_last;
252 edje_password_show_last_timeout_set(double password_show_last_timeout)
254 if (_edje_password_show_last_timeout == FROM_DOUBLE(password_show_last_timeout)) return;
255 _edje_password_show_last_timeout = FROM_DOUBLE(password_show_last_timeout);
259 edje_object_scale_set(Evas_Object *obj, double scale)
263 ed = _edje_fetch(obj);
264 if (!ed) return EINA_FALSE;
265 if (ed->scale == scale) return EINA_TRUE;
266 ed->scale = FROM_DOUBLE(scale);
267 edje_object_calc_force(obj);
272 edje_object_scale_get(const Evas_Object *obj)
276 ed = _edje_fetch(obj);
278 return TO_DOUBLE(ed->scale);
282 edje_object_mirrored_get(const Evas_Object *obj)
286 ed = _edje_fetch(obj);
287 if (!ed) return EINA_FALSE;
293 _edje_object_orientation_inform(Evas_Object *obj)
295 if (edje_object_mirrored_get(obj))
296 edje_object_signal_emit(obj, "edje,state,rtl", "edje");
298 edje_object_signal_emit(obj, "edje,state,ltr", "edje");
302 edje_object_mirrored_set(Evas_Object *obj, Eina_Bool rtl)
307 ed = _edje_fetch(obj);
309 if (ed->is_rtl == rtl) return;
313 for (i = 0 ; i < ed->table_parts_size ; i++)
319 ep = ed->table_parts[i];
320 s = ep->param1.description->state.name,
321 v = ep->param1.description->state.value;
322 _edje_part_description_apply(ed, ep, s, v , NULL, 0.0);
323 ep->chosen_description = ep->param1.description;
327 _edje_object_orientation_inform(obj);
333 edje_object_data_get(const Evas_Object *obj, const char *key)
337 ed = _edje_fetch(obj);
340 if (!ed->collection) return NULL;
341 if (!ed->collection->data) return NULL;
342 return edje_string_get(eina_hash_find(ed->collection->data, key));
346 edje_object_freeze(Evas_Object *obj)
351 ed = _edje_fetch(obj);
353 for (i = 0; i < ed->table_parts_size; i++)
356 rp = ed->table_parts[i];
357 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
358 edje_object_freeze(rp->swallowed_object);
360 return _edje_freeze(ed);
364 edje_object_thaw(Evas_Object *obj)
369 ed = _edje_fetch(obj);
371 for (i = 0; i < ed->table_parts_size; i++)
375 rp = ed->table_parts[i];
376 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
377 edje_object_thaw(rp->swallowed_object);
379 return _edje_thaw(ed);
383 edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3)
386 Edje_Color_Class *cc;
388 if (!color_class) return EINA_FALSE;
390 cc = eina_hash_find(_edje_color_class_hash, color_class);
393 cc = calloc(1, sizeof(Edje_Color_Class));
394 if (!cc) return EINA_FALSE;
395 cc->name = eina_stringshare_add(color_class);
401 if (!_edje_color_class_hash)
402 _edje_color_class_hash = eina_hash_string_superfast_new(NULL);
403 eina_hash_add(_edje_color_class_hash, color_class, cc);
407 else if (r > 255) r = 255;
409 else if (g > 255) g = 255;
411 else if (b > 255) b = 255;
413 else if (a > 255) a = 255;
414 if ((cc->r == r) && (cc->g == g) &&
415 (cc->b == b) && (cc->a == a) &&
416 (cc->r2 == r2) && (cc->g2 == g2) &&
417 (cc->b2 == b2) && (cc->a2 == a2) &&
418 (cc->r3 == r3) && (cc->g3 == g3) &&
419 (cc->b3 == b3) && (cc->a3 == a3))
434 members = eina_hash_find(_edje_color_class_member_hash, color_class);
439 ed = eina_list_data_get(members);
441 #ifdef EDJE_CALC_CACHE
442 ed->all_part_change = 1;
445 _edje_emit(ed, "color_class,set", color_class);
446 members = eina_list_next(members);
452 edje_color_class_get(const char *color_class, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3)
454 Edje_Color_Class *cc;
459 cc = eina_hash_find(_edje_color_class_hash, color_class);
463 #define X(C) if (C) *C = cc->C
464 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
474 #define X(C) if (C) *C = 0
475 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
486 edje_color_class_del(const char *color_class)
488 Edje_Color_Class *cc;
491 if (!color_class) return;
493 cc = eina_hash_find(_edje_color_class_hash, color_class);
496 eina_hash_del(_edje_color_class_hash, color_class, cc);
497 eina_stringshare_del(cc->name);
500 members = eina_hash_find(_edje_color_class_member_hash, color_class);
505 ed = eina_list_data_get(members);
507 #ifdef EDJE_CALC_CACHE
508 ed->all_part_change = 1;
511 _edje_emit(ed, "color_class,del", color_class);
512 members = eina_list_next(members);
517 edje_color_class_list(void)
519 Edje_List_Foreach_Data fdata;
521 if (!color_class) return NULL;
523 memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
524 eina_hash_foreach(_edje_color_class_member_hash,
525 _edje_color_class_list_foreach, &fdata);
531 _edje_color_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
533 Edje_List_Foreach_Data *fd;
536 fd->list = eina_list_append(fd->list, strdup(key));
541 edje_object_color_class_set(Evas_Object *obj, const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3)
545 Edje_Color_Class *cc;
548 ed = _edje_fetch(obj);
549 if ((!ed) || (!color_class)) return EINA_FALSE;
551 else if (r > 255) r = 255;
553 else if (g > 255) g = 255;
555 else if (b > 255) b = 255;
557 else if (a > 255) a = 255;
558 color_class = eina_stringshare_add(color_class);
559 if (!color_class) return EINA_FALSE;
560 EINA_LIST_FOREACH(ed->color_classes, l, cc)
562 if (cc->name == color_class)
564 eina_stringshare_del(color_class);
566 if ((cc->r == r) && (cc->g == g) &&
567 (cc->b == b) && (cc->a == a) &&
568 (cc->r2 == r2) && (cc->g2 == g2) &&
569 (cc->b2 == b2) && (cc->a2 == a2) &&
570 (cc->r3 == r3) && (cc->g3 == g3) &&
571 (cc->b3 == b3) && (cc->a3 == a3))
586 #ifdef EDJE_CALC_CACHE
587 ed->all_part_change = 1;
593 cc = malloc(sizeof(Edje_Color_Class));
596 eina_stringshare_del(color_class);
599 cc->name = color_class;
612 ed->color_classes = eina_list_append(ed->color_classes, cc);
614 #ifdef EDJE_CALC_CACHE
615 ed->all_part_change = 1;
618 for (i = 0; i < ed->table_parts_size; i++)
622 rp = ed->table_parts[i];
623 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
624 edje_object_color_class_set(rp->swallowed_object, color_class,
625 r, g, b, a, r2, g2, b2, a2, r3, g3, b3,
630 _edje_emit(ed, "color_class,set", color_class);
635 edje_object_color_class_get(const Evas_Object *obj, const char *color_class, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3)
637 Edje *ed = _edje_fetch(obj);
638 Edje_Color_Class *cc = _edje_color_class_find(ed, color_class);
642 #define X(C) if (C) *C = cc->C
643 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
653 #define X(C) if (C) *C = 0
654 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
665 edje_object_color_class_del(Evas_Object *obj, const char *color_class)
669 Edje_Color_Class *cc = NULL;
672 if (!color_class) return;
674 ed = _edje_fetch(obj);
675 EINA_LIST_FOREACH(ed->color_classes, l, cc)
677 if (!strcmp(cc->name, color_class))
679 ed->color_classes = eina_list_remove(ed->color_classes, cc);
680 eina_stringshare_del(cc->name);
686 for (i = 0; i < ed->table_parts_size; i++)
690 rp = ed->table_parts[i];
691 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
692 edje_object_color_class_del(rp->swallowed_object, color_class);
696 #ifdef EDJE_CALC_CACHE
697 ed->all_part_change = 1;
700 _edje_emit(ed, "color_class,del", color_class);
704 edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size size)
709 if (!text_class) return EINA_FALSE;
710 if (!font) font = "";
712 tc = eina_hash_find(_edje_text_class_hash, text_class);
713 /* Create new text class */
716 tc = calloc(1, sizeof(Edje_Text_Class));
717 if (!tc) return EINA_FALSE;
718 tc->name = eina_stringshare_add(text_class);
724 if (!_edje_text_class_hash) _edje_text_class_hash = eina_hash_string_superfast_new(NULL);
725 eina_hash_add(_edje_text_class_hash, text_class, tc);
727 tc->font = eina_stringshare_add(font);
732 /* If the class found is the same just return */
733 if ((tc->size == size) && (tc->font) && (!strcmp(tc->font, font)))
736 /* Update the class found */
737 eina_stringshare_del(tc->font);
738 tc->font = eina_stringshare_add(font);
741 eina_hash_del(_edje_text_class_hash, text_class, tc);
747 /* Tell all members of the text class to recalc */
748 members = eina_hash_find(_edje_text_class_member_hash, text_class);
753 ed = eina_list_data_get(members);
755 _edje_textblock_style_all_update(ed);
756 #ifdef EDJE_CALC_CACHE
757 ed->text_part_change = 1;
760 members = eina_list_next(members);
766 edje_text_class_del(const char *text_class)
771 if (!text_class) return;
773 tc = eina_hash_find(_edje_text_class_hash, text_class);
776 eina_hash_del(_edje_text_class_hash, text_class, tc);
777 eina_stringshare_del(tc->name);
778 eina_stringshare_del(tc->font);
781 members = eina_hash_find(_edje_text_class_member_hash, text_class);
786 ed = eina_list_data_get(members);
788 _edje_textblock_style_all_update(ed);
789 #ifdef EDJE_CALC_CACHE
790 ed->text_part_change = 1;
793 members = eina_list_next(members);
798 edje_text_class_list(void)
800 Edje_List_Foreach_Data fdata;
802 memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
803 eina_hash_foreach(_edje_text_class_member_hash,
804 _edje_text_class_list_foreach, &fdata);
809 _edje_text_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
811 Edje_List_Foreach_Data *fd;
814 fd->list = eina_list_append(fd->list, eina_stringshare_add(key));
819 edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char *font, Evas_Font_Size size)
826 ed = _edje_fetch(obj);
827 if ((!ed) || (!text_class)) return EINA_FALSE;
829 /* for each text_class in the edje */
830 EINA_LIST_FOREACH(ed->text_classes, l, tc)
832 if ((tc->name) && (!strcmp(tc->name, text_class)))
834 /* Match and the same, return */
835 if ((tc->font) && (font) && (!strcmp(tc->font, font)) &&
839 /* No font but size is the same, return */
840 if ((!tc->font) && (!font) && (tc->size == size)) return EINA_TRUE;
842 /* Update new text class properties */
843 if (tc->font) eina_stringshare_del(tc->font);
844 if (font) tc->font = eina_stringshare_add(font);
845 else tc->font = NULL;
850 #ifdef EDJE_CALC_CACHE
851 ed->text_part_change = 1;
858 /* No matches, create a new text class */
859 tc = calloc(1, sizeof(Edje_Text_Class));
860 if (!tc) return EINA_FALSE;
861 tc->name = eina_stringshare_add(text_class);
867 if (font) tc->font = eina_stringshare_add(font);
868 else tc->font = NULL;
871 for (i = 0; i < ed->table_parts_size; i++)
875 rp = ed->table_parts[i];
876 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
877 edje_object_text_class_set(rp->swallowed_object, text_class,
881 /* Add to edje's text class list */
882 ed->text_classes = eina_list_append(ed->text_classes, tc);
884 #ifdef EDJE_CALC_CACHE
885 ed->text_part_change = 1;
887 _edje_textblock_style_all_update(ed);
893 edje_object_part_exists(const Evas_Object *obj, const char *part)
898 ed = _edje_fetch(obj);
899 if ((!ed) || (!part)) return EINA_FALSE;
900 rp = _edje_real_part_recursive_get(ed, (char *)part);
901 if (!rp) return EINA_FALSE;
905 EAPI const Evas_Object *
906 edje_object_part_object_get(const Evas_Object *obj, const char *part)
911 ed = _edje_fetch(obj);
912 if ((!ed) || (!part)) return NULL;
914 /* Need to recalc before providing the object. */
917 rp = _edje_real_part_recursive_get(ed, (char *)part);
918 if (!rp) return NULL;
923 edje_object_part_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h )
928 ed = _edje_fetch(obj);
929 if ((!ed) || (!part))
938 /* Need to recalc before providing the object. */
941 rp = _edje_real_part_recursive_get(ed, (char *)part);
958 edje_object_item_provider_set(Evas_Object *obj, Edje_Item_Provider_Cb func, void *data)
962 ed = _edje_fetch(obj);
964 ed->item_provider.func = func;
965 ed->item_provider.data = data;
968 /* FIXDOC: New Function */
970 edje_object_text_change_cb_set(Evas_Object *obj, Edje_Text_Change_Cb func, void *data)
975 ed = _edje_fetch(obj);
977 ed->text_change.func = func;
978 ed->text_change.data = data;
980 for (i = 0; i < ed->table_parts_size; i++)
984 rp = ed->table_parts[i];
985 if ((rp->part->type == EDJE_PART_TYPE_GROUP) && (rp->swallowed_object))
986 edje_object_text_change_cb_set(rp->swallowed_object, func, data);
991 _edje_object_part_text_raw_set(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text)
993 if ((!rp->text.text) && (!text))
995 if ((rp->text.text) && (text) &&
996 (!strcmp(rp->text.text, text)))
1000 eina_stringshare_del(rp->text.text);
1001 rp->text.text = NULL;
1003 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1004 _edje_entry_text_markup_set(rp, text);
1006 if (text) rp->text.text = eina_stringshare_add(text);
1007 rp->edje->dirty = 1;
1008 #ifdef EDJE_CALC_CACHE
1011 _edje_recalc(rp->edje);
1012 if (rp->edje->text_change.func)
1013 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1018 _edje_object_part_text_raw_append(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text)
1020 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1021 _edje_entry_text_markup_append(rp, text);
1027 int len_added = strlen(text);
1028 int len_old = strlen(rp->text.text);
1029 new = malloc(len_old + len_added + 1);
1030 memcpy(new, rp->text.text, len_old);
1031 memcpy(new + len_old, text, len_added);
1032 new[len_old + len_added] = '\0';
1033 eina_stringshare_replace(&rp->text.text, new);
1038 eina_stringshare_replace(&rp->text.text, text);
1041 rp->edje->dirty = 1;
1042 #ifdef EDJE_CALC_CACHE
1045 _edje_recalc(rp->edje);
1046 if (rp->edje->text_change.func)
1047 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1052 edje_object_part_text_set(Evas_Object *obj, const char *part, const char *text)
1057 ed = _edje_fetch(obj);
1058 if ((!ed) || (!part)) return EINA_FALSE;
1059 rp = _edje_real_part_recursive_get(ed, (char *)part);
1060 if (!rp) return EINA_FALSE;
1061 if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
1062 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return EINA_FALSE;
1063 return _edje_object_part_text_raw_set(obj, rp, part, text);
1067 edje_object_part_text_get(const Evas_Object *obj, const char *part)
1072 ed = _edje_fetch(obj);
1073 if ((!ed) || (!part)) return NULL;
1075 /* Need to recalc before providing the object. */
1076 _edje_recalc_do(ed);
1078 rp = _edje_real_part_recursive_get(ed, (char *)part);
1079 if (!rp) return NULL;
1080 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1081 return _edje_entry_text_get(rp);
1084 if (rp->part->type == EDJE_PART_TYPE_TEXT) return rp->text.text;
1085 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1086 return evas_object_textblock_text_markup_get(rp->object);
1092 _edje_text_escape(const char *text)
1096 const char *text_end;
1099 if (!text) return NULL;
1101 txt = eina_strbuf_new();
1102 text_len = strlen(text);
1104 text_end = text + text_len;
1105 while (text < text_end)
1108 const char *escaped = evas_textblock_string_escape_get(text, &advance);
1111 eina_strbuf_append_char(txt, text[0]);
1115 eina_strbuf_append(txt, escaped);
1120 ret = eina_strbuf_string_steal(txt);
1121 eina_strbuf_free(txt);
1126 _edje_text_unescape(const char *text)
1130 const char *text_end, *last, *escape_start;
1133 if (!text) return NULL;
1135 txt = eina_strbuf_new();
1136 text_len = strlen(text);
1138 text_end = text + text_len;
1140 escape_start = NULL;
1141 for (; text < text_end; text++)
1155 len = text - escape_start;
1160 eina_strbuf_append_n(txt, str, len);
1162 escape_start = text;
1165 else if ((*text == ';') && (escape_start))
1168 const char *str = evas_textblock_escape_string_range_get(escape_start, text);
1175 len = text + 1 - escape_start;
1178 eina_strbuf_append_n(txt, str, len);
1180 escape_start = NULL;
1185 if (!last && escape_start)
1186 last = escape_start;
1188 if (last && (text > last))
1190 size_t len = text - last;
1191 eina_strbuf_append_n(txt, last, len);
1194 ret = eina_strbuf_string_steal(txt);
1195 eina_strbuf_free(txt);
1200 edje_object_part_text_unescaped_set(Evas_Object *obj, const char *part, const char *text_to_escape)
1204 Eina_Bool ret = EINA_FALSE;
1206 ed = _edje_fetch(obj);
1207 if ((!ed) || (!part)) return ret;
1208 rp = _edje_real_part_recursive_get(ed, part);
1209 if (!rp) return ret;
1210 if (rp->part->type == EDJE_PART_TYPE_TEXT)
1211 ret = _edje_object_part_text_raw_set(obj, rp, part, text_to_escape);
1212 else if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1214 char *text = _edje_text_escape(text_to_escape);
1216 ret = _edje_object_part_text_raw_set(obj, rp, part, text);
1223 edje_object_part_text_unescaped_get(const Evas_Object *obj, const char *part)
1228 ed = _edje_fetch(obj);
1229 if ((!ed) || (!part)) return NULL;
1231 /* Need to recalc before providing the object. */
1232 _edje_recalc_do(ed);
1234 rp = _edje_real_part_recursive_get(ed, (char *)part);
1235 if (!rp) return NULL;
1236 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1238 const char *t = _edje_entry_text_get(rp);
1239 return _edje_text_unescape(t);
1243 if (rp->part->type == EDJE_PART_TYPE_TEXT) return strdup(rp->text.text);
1244 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1246 const char *t = evas_object_textblock_text_markup_get(rp->object);
1247 return _edje_text_unescape(t);
1254 edje_object_part_text_selection_get(const Evas_Object *obj, const char *part)
1259 ed = _edje_fetch(obj);
1260 if ((!ed) || (!part)) return NULL;
1261 rp = _edje_real_part_recursive_get(ed, (char *)part);
1262 if (!rp) return NULL;
1263 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1264 return _edje_entry_selection_get(rp);
1269 edje_object_part_text_select_none(const Evas_Object *obj, const char *part)
1274 ed = _edje_fetch(obj);
1275 if ((!ed) || (!part)) return;
1276 rp = _edje_real_part_recursive_get(ed, (char *)part);
1278 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1279 _edje_entry_select_none(rp);
1283 edje_object_part_text_select_all(const Evas_Object *obj, const char *part)
1288 ed = _edje_fetch(obj);
1289 if ((!ed) || (!part)) return;
1290 rp = _edje_real_part_recursive_get(ed, (char *)part);
1292 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1293 _edje_entry_select_all(rp);
1297 edje_object_part_text_insert(Evas_Object *obj, const char *part, const char *text)
1302 ed = _edje_fetch(obj);
1303 if ((!ed) || (!part)) return;
1304 rp = _edje_real_part_recursive_get(ed, (char *)part);
1306 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
1307 if (rp->part->entry_mode <= EDJE_ENTRY_EDIT_MODE_NONE) return;
1308 _edje_entry_text_markup_insert(rp, text);
1309 rp->edje->dirty = 1;
1310 #ifdef EDJE_CALC_CACHE
1313 _edje_recalc(rp->edje);
1314 if (rp->edje->text_change.func)
1315 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1319 edje_object_part_text_append(Evas_Object *obj, const char *part, const char *text)
1324 ed = _edje_fetch(obj);
1325 if ((!ed) || (!part)) return;
1326 rp = _edje_real_part_recursive_get(ed, (char *)part);
1328 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
1329 _edje_object_part_text_raw_append(obj, rp, part, text);
1330 rp->edje->dirty = 1;
1331 #ifdef EDJE_CALC_CACHE
1334 _edje_recalc(rp->edje);
1335 if (rp->edje->text_change.func)
1336 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1339 EAPI const Eina_List *
1340 edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part)
1345 ed = _edje_fetch(obj);
1346 if ((!ed) || (!part)) return NULL;
1347 rp = _edje_real_part_recursive_get(ed, (char *)part);
1348 if (!rp) return NULL;
1349 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1350 return _edje_entry_anchors_list(rp);
1354 EAPI const Eina_List *
1355 edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *part, const char *anchor)
1360 ed = _edje_fetch(obj);
1361 if ((!ed) || (!part)) return NULL;
1362 rp = _edje_real_part_recursive_get(ed, (char *)part);
1363 if (!rp) return NULL;
1364 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1365 return _edje_entry_anchor_geometry_get(rp, anchor);
1369 EAPI const Eina_List *
1370 edje_object_part_text_item_list_get(const Evas_Object *obj, const char *part)
1375 ed = _edje_fetch(obj);
1376 if ((!ed) || (!part)) return NULL;
1377 rp = _edje_real_part_recursive_get(ed, (char *)part);
1378 if (!rp) return NULL;
1379 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1380 return _edje_entry_items_list(rp);
1385 edje_object_part_text_item_geometry_get(const Evas_Object *obj, const char *part, const char *item, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch)
1390 ed = _edje_fetch(obj);
1391 if ((!ed) || (!part)) return EINA_FALSE;
1392 rp = _edje_real_part_recursive_get(ed, (char *)part);
1393 if (!rp) return EINA_FALSE;
1394 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1395 return _edje_entry_item_geometry_get(rp, item, cx, cy, cw, ch);
1400 edje_object_part_text_cursor_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
1405 ed = _edje_fetch(obj);
1410 if ((!ed) || (!part)) return;
1411 rp = _edje_real_part_recursive_get(ed, (char *)part);
1413 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1415 _edje_entry_cursor_geometry_get(rp, x, y, w, h);
1416 if (x) *x -= rp->edje->x;
1417 if (y) *y -= rp->edje->y;
1423 edje_object_part_text_select_allow_set(const Evas_Object *obj, const char *part, Eina_Bool allow)
1428 ed = _edje_fetch(obj);
1429 if ((!ed) || (!part)) return;
1430 rp = _edje_real_part_recursive_get(ed, (char *)part);
1432 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1433 _edje_entry_select_allow_set(rp, allow);
1437 edje_object_part_text_select_abort(const Evas_Object *obj, const char *part)
1442 ed = _edje_fetch(obj);
1443 if ((!ed) || (!part)) return;
1444 rp = _edje_real_part_recursive_get(ed, (char *)part);
1446 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1447 _edje_entry_select_abort(rp);
1451 edje_object_part_text_select_begin(const Evas_Object *obj, const char *part)
1456 ed = _edje_fetch(obj);
1457 if ((!ed) || (!part)) return;
1458 rp = _edje_real_part_recursive_get(ed, (char *)part);
1460 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1461 _edje_entry_select_begin(rp);
1465 edje_object_part_text_select_extend(const Evas_Object *obj, const char *part)
1470 ed = _edje_fetch(obj);
1471 if ((!ed) || (!part)) return;
1472 rp = _edje_real_part_recursive_get(ed, (char *)part);
1474 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1475 _edje_entry_select_extend(rp);
1479 edje_object_part_text_cursor_next(Evas_Object *obj, const char *part, Edje_Cursor cur)
1484 ed = _edje_fetch(obj);
1485 if ((!ed) || (!part)) return EINA_FALSE;
1486 rp = _edje_real_part_recursive_get(ed, (char *)part);
1487 if (!rp) return EINA_FALSE;
1488 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1490 return _edje_entry_cursor_next(rp, cur);
1496 edje_object_part_text_cursor_prev(Evas_Object *obj, const char *part, Edje_Cursor cur)
1501 ed = _edje_fetch(obj);
1502 if ((!ed) || (!part)) return EINA_FALSE;
1503 rp = _edje_real_part_recursive_get(ed, (char *)part);
1504 if (!rp) return EINA_FALSE;
1505 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1507 return _edje_entry_cursor_prev(rp, cur);
1513 edje_object_part_text_cursor_up(Evas_Object *obj, const char *part, Edje_Cursor cur)
1518 ed = _edje_fetch(obj);
1519 if ((!ed) || (!part)) return EINA_FALSE;
1520 rp = _edje_real_part_recursive_get(ed, (char *)part);
1521 if (!rp) return EINA_FALSE;
1522 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1524 return _edje_entry_cursor_up(rp, cur);
1530 edje_object_part_text_cursor_down(Evas_Object *obj, const char *part, Edje_Cursor cur)
1535 ed = _edje_fetch(obj);
1536 if ((!ed) || (!part)) return EINA_FALSE;
1537 rp = _edje_real_part_recursive_get(ed, (char *)part);
1538 if (!rp) return EINA_FALSE;
1539 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1541 return _edje_entry_cursor_down(rp, cur);
1547 edje_object_part_text_cursor_begin_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1552 ed = _edje_fetch(obj);
1553 if ((!ed) || (!part)) return;
1554 rp = _edje_real_part_recursive_get(ed, (char *)part);
1556 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1558 _edje_entry_cursor_begin(rp, cur);
1563 edje_object_part_text_cursor_end_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1568 ed = _edje_fetch(obj);
1569 if ((!ed) || (!part)) return;
1570 rp = _edje_real_part_recursive_get(ed, (char *)part);
1572 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1574 _edje_entry_cursor_end(rp, cur);
1579 edje_object_part_text_cursor_copy(Evas_Object *obj, const char *part, Edje_Cursor src, Edje_Cursor dst)
1584 ed = _edje_fetch(obj);
1585 if ((!ed) || (!part)) return;
1586 rp = _edje_real_part_recursive_get(ed, (char *)part);
1588 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1590 _edje_entry_cursor_copy(rp, src, dst);
1595 edje_object_part_text_cursor_line_begin_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1600 ed = _edje_fetch(obj);
1601 if ((!ed) || (!part)) return;
1602 rp = _edje_real_part_recursive_get(ed, (char *)part);
1604 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1606 _edje_entry_cursor_line_begin(rp, cur);
1611 edje_object_part_text_cursor_line_end_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1616 ed = _edje_fetch(obj);
1617 if ((!ed) || (!part)) return;
1618 rp = _edje_real_part_recursive_get(ed, (char *)part);
1620 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1622 _edje_entry_cursor_line_end(rp, cur);
1627 edje_object_part_text_cursor_coord_set(Evas_Object *obj, const char *part,
1628 Edje_Cursor cur, Evas_Coord x, Evas_Coord y)
1633 ed = _edje_fetch(obj);
1634 if ((!ed) || (!part)) return EINA_FALSE;
1635 rp = _edje_real_part_recursive_get(ed, (char *)part);
1636 if (!rp) return EINA_FALSE;
1637 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1639 return _edje_entry_cursor_coord_set(rp, cur, x, y);
1645 edje_object_part_text_cursor_is_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1650 ed = _edje_fetch(obj);
1651 if ((!ed) || (!part)) return EINA_FALSE;
1652 rp = _edje_real_part_recursive_get(ed, (char *)part);
1653 if (!rp) return EINA_FALSE;
1654 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1656 return _edje_entry_cursor_is_format_get(rp, cur);
1662 edje_object_part_text_cursor_is_visible_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1667 ed = _edje_fetch(obj);
1668 if ((!ed) || (!part)) return 0;
1669 rp = _edje_real_part_recursive_get(ed, (char *)part);
1671 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1673 return _edje_entry_cursor_is_visible_format_get(rp, cur);
1679 edje_object_part_text_cursor_content_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1684 ed = _edje_fetch(obj);
1685 if ((!ed) || (!part)) return NULL;
1686 rp = _edje_real_part_recursive_get(ed, part);
1687 if (!rp) return NULL;
1688 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1690 return _edje_entry_cursor_content_get(rp, cur);
1696 edje_object_part_text_cursor_pos_set(Evas_Object *obj, const char *part, Edje_Cursor cur, int pos)
1701 ed = _edje_fetch(obj);
1702 if ((!ed) || (!part)) return;
1703 rp = _edje_real_part_recursive_get(ed, part);
1705 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1707 _edje_entry_cursor_pos_set(rp, cur, pos);
1712 edje_object_part_text_cursor_pos_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1717 ed = _edje_fetch(obj);
1718 if ((!ed) || (!part)) return 0;
1719 rp = _edje_real_part_recursive_get(ed, part);
1721 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1723 return _edje_entry_cursor_pos_get(rp, cur);
1729 edje_object_part_text_input_panel_layout_set(const Evas_Object *obj, const char *part, Edje_Input_Panel_Layout layout)
1734 ed = _edje_fetch(obj);
1735 if ((!ed) || (!part)) return;
1736 rp = _edje_real_part_recursive_get(ed, part);
1738 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1740 return _edje_entry_input_panel_layout_set(rp, layout);
1744 EAPI Edje_Input_Panel_Layout
1745 edje_object_part_text_input_panel_layout_get(const Evas_Object *obj, const char *part)
1750 ed = _edje_fetch(obj);
1751 if ((!ed) || (!part)) return EDJE_INPUT_PANEL_LAYOUT_INVALID;
1752 rp = _edje_real_part_recursive_get(ed, part);
1753 if (!rp) return EINA_FALSE;
1754 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1756 return _edje_entry_input_panel_layout_get(rp);
1758 return EDJE_INPUT_PANEL_LAYOUT_INVALID;
1762 edje_object_text_insert_filter_callback_add(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
1765 Edje_Text_Insert_Filter_Callback *cb;
1767 ed = _edje_fetch(obj);
1768 if ((!ed) || (!part)) return;
1769 cb = calloc(1, sizeof(Edje_Text_Insert_Filter_Callback));
1770 cb->part = eina_stringshare_add(part);
1772 cb->data = (void *)data;
1773 ed->text_insert_filter_callbacks =
1774 eina_list_append(ed->text_insert_filter_callbacks, cb);
1778 edje_object_text_insert_filter_callback_del(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func)
1781 Edje_Text_Insert_Filter_Callback *cb;
1784 ed = _edje_fetch(obj);
1785 if ((!ed) || (!part)) return NULL;
1786 EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
1788 if ((!strcmp(cb->part, part)) && (cb->func == func))
1790 void *data = cb->data;
1791 ed->text_insert_filter_callbacks =
1792 eina_list_remove_list(ed->text_insert_filter_callbacks, l);
1793 eina_stringshare_del(cb->part);
1802 edje_object_text_insert_filter_callback_del_full(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
1805 Edje_Text_Insert_Filter_Callback *cb;
1808 ed = _edje_fetch(obj);
1809 if ((!ed) || (!part)) return NULL;
1810 EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
1812 if ((!strcmp(cb->part, part)) && (cb->func == func) &&
1815 void *tmp = cb->data;
1816 ed->text_insert_filter_callbacks =
1817 eina_list_remove_list(ed->text_insert_filter_callbacks, l);
1818 eina_stringshare_del(cb->part);
1827 edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_swallow)
1832 ed = _edje_fetch(obj);
1833 if ((!ed) || (!part)) return EINA_FALSE;
1835 /* Need to recalc before providing the object. */
1836 // XXX: I guess this is not required, removing for testing purposes
1837 // XXX: uncomment if you see glitches in e17 or others.
1838 // XXX: by Gustavo, January 21th 2009.
1839 // XXX: I got a backtrace with over 30000 calls without this,
1840 // XXX: only with 32px shelves. The problem is probably somewhere else,
1841 // XXX: but until it's found, leave this here.
1842 // XXX: by Sachiel, January 21th 2009, 19:30 UTC
1843 _edje_recalc_do(ed);
1845 rp = _edje_real_part_recursive_get(ed, (char *)part);
1846 if (!rp) return EINA_FALSE;
1847 if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
1849 ERR("cannot unswallow part %s: not swallow type!", rp->part->name);
1852 _edje_real_part_swallow(rp, obj_swallow, EINA_TRUE);
1857 _recalc_extern_parent(Evas_Object *obj)
1859 Evas_Object *parent;
1862 parent = evas_object_smart_parent_get(obj);
1863 ed = _edje_fetch(parent);
1870 edje_extern_object_min_size_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord minh)
1874 evas_object_size_hint_min_set(obj, minw, minh);
1875 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
1878 rp->swallow_params.min.w = minw;
1879 rp->swallow_params.min.h = minh;
1881 _recalc_extern_parent(obj);
1886 edje_extern_object_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord maxh)
1890 evas_object_size_hint_max_set(obj, maxw, maxh);
1891 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
1894 rp->swallow_params.max.w = maxw;
1895 rp->swallow_params.max.h = maxh;
1897 _recalc_extern_parent(obj);
1902 edje_extern_object_aspect_set(Evas_Object *obj, Edje_Aspect_Control aspect, Evas_Coord aw, Evas_Coord ah)
1905 Evas_Aspect_Control asp;
1907 asp = EVAS_ASPECT_CONTROL_NONE;
1910 case EDJE_ASPECT_CONTROL_NONE: asp = EVAS_ASPECT_CONTROL_NONE; break;
1911 case EDJE_ASPECT_CONTROL_NEITHER: asp = EVAS_ASPECT_CONTROL_NEITHER; break;
1912 case EDJE_ASPECT_CONTROL_HORIZONTAL: asp = EVAS_ASPECT_CONTROL_HORIZONTAL; break;
1913 case EDJE_ASPECT_CONTROL_VERTICAL: asp = EVAS_ASPECT_CONTROL_VERTICAL; break;
1914 case EDJE_ASPECT_CONTROL_BOTH: asp = EVAS_ASPECT_CONTROL_BOTH; break;
1919 evas_object_size_hint_aspect_set(obj, asp, aw, ah);
1920 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
1923 rp->swallow_params.aspect.mode = aspect;
1924 rp->swallow_params.aspect.w = aw;
1925 rp->swallow_params.aspect.h = ah;
1926 _recalc_extern_parent(obj);
1930 struct edje_box_layout_builtin {
1932 Evas_Object_Box_Layout cb;
1935 static Evas_Object_Box_Layout
1936 _edje_box_layout_builtin_find(const char *name)
1938 const struct edje_box_layout_builtin _edje_box_layout_builtin[] = {
1939 {"horizontal", evas_object_box_layout_horizontal},
1940 {"horizontal_flow", evas_object_box_layout_flow_horizontal},
1941 {"horizontal_homogeneous", evas_object_box_layout_homogeneous_horizontal},
1942 {"horizontal_max", evas_object_box_layout_homogeneous_max_size_horizontal},
1943 {"stack", evas_object_box_layout_stack},
1944 {"vertical", evas_object_box_layout_vertical},
1945 {"vertical_flow", evas_object_box_layout_flow_vertical},
1946 {"vertical_homogeneous", evas_object_box_layout_homogeneous_vertical},
1947 {"vertical_max", evas_object_box_layout_homogeneous_max_size_vertical},
1950 const struct edje_box_layout_builtin *base;
1955 base = _edje_box_layout_builtin + 0;
1958 base = _edje_box_layout_builtin + 4;
1961 base = _edje_box_layout_builtin + 5;
1967 for (; (base->name) && (base->name[0] == name[0]); base++)
1968 if (strcmp(base->name, name) == 0)
1974 static Eina_Rbtree_Direction
1975 _edje_box_layout_external_node_cmp(const Eina_Rbtree *left, const Eina_Rbtree *right, __UNUSED__ void *data)
1977 Edje_Box_Layout *l = (Edje_Box_Layout *)left;
1978 Edje_Box_Layout *r = (Edje_Box_Layout *)right;
1980 if (strcmp(l->name, r->name) < 0)
1981 return EINA_RBTREE_RIGHT;
1983 return EINA_RBTREE_LEFT;
1987 _edje_box_layout_external_find_cmp(const Eina_Rbtree *node, const void *key, __UNUSED__ int length, __UNUSED__ void *data)
1989 Edje_Box_Layout *l = (Edje_Box_Layout *)node;
1990 return strcmp(key, l->name);
1993 static Edje_Box_Layout *
1994 _edje_box_layout_external_find(const char *name)
1996 return (Edje_Box_Layout *)eina_rbtree_inline_lookup
1997 (_edje_box_layout_registry, name, 0, _edje_box_layout_external_find_cmp,
2002 _edje_box_layout_find(const char *name, Evas_Object_Box_Layout *cb, void **data, void (**free_data)(void *data))
2004 const Edje_Box_Layout *l;
2006 if (!name) return EINA_FALSE;
2008 *cb = _edje_box_layout_builtin_find(name);
2016 l = _edje_box_layout_external_find(name);
2017 if (!l) return EINA_FALSE;
2020 *free_data = l->layout_data_free;
2021 if (l->layout_data_get)
2022 *data = l->layout_data_get(l->data);
2030 _edje_box_layout_external_free(Eina_Rbtree *node, __UNUSED__ void *data)
2032 Edje_Box_Layout *l = (Edje_Box_Layout *)node;
2034 if (l->data && l->free_data)
2035 l->free_data(l->data);
2039 static Edje_Box_Layout *
2040 _edje_box_layout_external_new(const char *name, Evas_Object_Box_Layout func, void *(*layout_data_get)(void *), void (*layout_data_free)(void *), void (*free_data)(void *), void *data)
2045 name_len = strlen(name) + 1;
2046 l = malloc(sizeof(Edje_Box_Layout) + name_len);
2054 l->layout_data_get = layout_data_get;
2055 l->layout_data_free = layout_data_free;
2056 l->free_data = free_data;
2059 memcpy(l->name, name, name_len);
2065 edje_box_layout_register(const char *name, Evas_Object_Box_Layout func, void *(*layout_data_get)(void *), void (*layout_data_free)(void *), void (*free_data)(void *), void *data)
2071 if (_edje_box_layout_builtin_find(name))
2073 ERR("Cannot register layout '%s': would override builtin!",
2076 if (data && free_data) free_data(data);
2080 l = _edje_box_layout_external_find(name);
2085 if (data && free_data) free_data(data);
2089 l = _edje_box_layout_external_new
2090 (name, func, layout_data_get, layout_data_free, free_data, data);
2094 _edje_box_layout_registry = eina_rbtree_inline_insert
2095 (_edje_box_layout_registry, (Eina_Rbtree *)l,
2096 _edje_box_layout_external_node_cmp, NULL);
2102 if (l->data && l->free_data) l->free_data(l->data);
2105 l->layout_data_get = layout_data_get;
2106 l->layout_data_free = layout_data_free;
2107 l->free_data = free_data;
2112 if (data && free_data) free_data(data);
2114 _edje_box_layout_registry = eina_rbtree_inline_remove
2115 (_edje_box_layout_registry, (Eina_Rbtree *)l,
2116 _edje_box_layout_external_node_cmp, NULL);
2117 _edje_box_layout_external_free((Eina_Rbtree *)l, NULL);
2123 edje_object_part_unswallow(Evas_Object *obj __UNUSED__, Evas_Object *obj_swallow)
2127 if (!obj_swallow) return;
2129 rp = (Edje_Real_Part *)evas_object_data_get(obj_swallow, "\377 edje.swallowing_part");
2132 if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
2134 ERR("cannot unswallow part %s: not swallow type!", rp->part->name);
2137 if (rp->swallowed_object == obj_swallow)
2139 evas_object_smart_member_del(rp->swallowed_object);
2140 evas_object_event_callback_del_full(rp->swallowed_object,
2142 _edje_object_part_swallow_free_cb,
2144 evas_object_event_callback_del_full(rp->swallowed_object,
2145 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
2146 _edje_object_part_swallow_changed_hints_cb,
2148 evas_object_clip_unset(rp->swallowed_object);
2149 evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
2151 if (rp->part->mouse_events)
2152 _edje_callbacks_del(rp->swallowed_object, rp->edje);
2153 _edje_callbacks_focus_del(rp->swallowed_object, rp->edje);
2155 rp->swallowed_object = NULL;
2156 rp->swallow_params.min.w = 0;
2157 rp->swallow_params.min.h = 0;
2158 rp->swallow_params.max.w = 0;
2159 rp->swallow_params.max.h = 0;
2160 rp->edje->dirty = 1;
2161 #ifdef EDJE_CALC_CACHE
2164 _edje_recalc_do(rp->edje);
2170 edje_object_part_swallow_get(const Evas_Object *obj, const char *part)
2175 ed = _edje_fetch(obj);
2176 if ((!ed) || (!part)) return NULL;
2178 /* Need to recalc before providing the object. */
2179 _edje_recalc_do(ed);
2181 rp = _edje_real_part_recursive_get(ed, (char *)part);
2182 if (!rp) return NULL;
2183 return rp->swallowed_object;
2187 edje_object_size_min_get(const Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
2191 ed = _edje_fetch(obj);
2192 if ((!ed) || (!ed->collection))
2194 if (minw) *minw = 0;
2195 if (minh) *minh = 0;
2198 if (minw) *minw = ed->collection->prop.min.w;
2199 if (minh) *minh = ed->collection->prop.min.h;
2203 edje_object_size_max_get(const Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh)
2207 ed = _edje_fetch(obj);
2208 if ((!ed) || (!ed->collection))
2210 if (maxw) *maxw = 0;
2211 if (maxh) *maxh = 0;
2215 /* Need to recalc before providing the object. */
2216 _edje_recalc_do(ed);
2218 if (ed->collection->prop.max.w == 0)
2220 /* XXX TODO: convert maxw to 0, fix things that break. */
2221 if (maxw) *maxw = EDJE_INF_MAX_W;
2225 if (maxw) *maxw = ed->collection->prop.max.w;
2227 if (ed->collection->prop.max.h == 0)
2229 /* XXX TODO: convert maxh to 0, fix things that break. */
2230 if (maxh) *maxh = EDJE_INF_MAX_H;
2234 if (maxh) *maxh = ed->collection->prop.max.h;
2239 edje_object_calc_force(Evas_Object *obj)
2244 ed = _edje_fetch(obj);
2247 #ifdef EDJE_CALC_CACHE
2248 ed->all_part_change = 1;
2251 pf2 = _edje_freeze_val;
2254 _edje_freeze_val = 0;
2257 _edje_recalc_do(ed);
2260 _edje_freeze_val = pf2;
2264 edje_object_size_min_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
2266 edje_object_size_min_restricted_calc(obj, minw, minh, 0, 0);
2270 edje_object_parts_extends_calc(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
2273 Evas_Coord x1 = INT_MAX, y1 = INT_MAX;
2274 Evas_Coord x2 = 0, y2 = 0;
2277 ed = _edje_fetch(obj);
2289 /* Need to recalc before providing the object. */
2291 _edje_recalc_do(ed);
2293 for (i = 0; i < ed->table_parts_size; i++)
2296 Evas_Coord rpx1, rpy1;
2297 Evas_Coord rpx2, rpy2;
2299 rp = ed->table_parts[i];
2303 rpx2 = rpx1 + rp->w;
2304 rpy2 = rpy1 + rp->h;
2306 if (x1 > rpx1) x1 = rpx1;
2307 if (y1 > rpy1) y1 = rpy1;
2308 if (x2 < rpx2) x2 = rpx2;
2309 if (y2 < rpy2) y2 = rpy2;
2316 if (w) *w = x2 - x1;
2317 if (h) *h = y2 - y1;
2323 edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh, Evas_Coord restrictedw, Evas_Coord restrictedh)
2330 Edje_Real_Part *pep = NULL;
2331 Eina_Bool has_non_fixed_tb = EINA_FALSE;
2333 ed = _edje_fetch(obj);
2334 if ((!ed) || (!ed->collection))
2336 if (minw) *minw = restrictedw;
2337 if (minh) *minh = restrictedh;
2346 ed->w = restrictedw;
2347 ed->h = restrictedh;
2358 #ifdef EDJE_CALC_CACHE
2359 ed->all_part_change = 1;
2361 _edje_recalc_do(ed);
2368 for (i = 0; i < ed->table_parts_size; i++)
2374 ep = ed->table_parts[i];
2375 w = ep->w - ep->req.w;
2376 h = ep->h - ep->req.h;
2378 if (ep->chosen_description)
2380 if (!ep->chosen_description->fixed.w)
2382 if ((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK))
2385 evas_object_textblock_size_formatted_get(ep->object,
2392 has_non_fixed_tb = EINA_TRUE;
2402 if (!ep->chosen_description->fixed.h)
2404 if (!((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) &&
2405 (!((Edje_Part_Description_Text *)ep->chosen_description)->text.min_x) &&
2416 if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)
2418 has_non_fixed_tb = EINA_TRUE;
2426 if (ed->w < restrictedw) ed->w = restrictedw;
2431 if (ed->h < restrictedh) ed->h = restrictedh;
2433 if ((ed->w > 4000) || (ed->h > 4000))
2435 /* Only print it if we have a non-fixed textblock.
2436 * We should possibly avoid all of this if in this case, but in
2437 * the meanwhile, just doing this. */
2438 if (!has_non_fixed_tb)
2441 ERR("file %s, group %s has a non-fixed part '%s'. Adding 'fixed: 1 1;' to source EDC may help. Continuing discarding faulty part.",
2442 ed->path, ed->group, pep->part->name);
2444 ERR("file %s, group %s overflowed 4000x4000 with minimum size of %dx%d. Continuing discarding faulty parts.",
2445 ed->path, ed->group, ed->w, ed->h);
2459 if (minw) *minw = ed->min.w;
2460 if (minh) *minh = ed->min.h;
2465 #ifdef EDJE_CALC_CACHE
2466 ed->all_part_change = 1;
2472 /* FIXME: Correctly return other states */
2474 edje_object_part_state_get(const Evas_Object *obj, const char *part, double *val_ret)
2479 ed = _edje_fetch(obj);
2480 if ((!ed) || (!part))
2482 if (val_ret) *val_ret = 0;
2486 /* Need to recalc before providing the object. */
2487 _edje_recalc_do(ed);
2489 rp = _edje_real_part_recursive_get(ed, (char *)part);
2492 if (val_ret) *val_ret = 0;
2493 INF("part not found");
2496 if (rp->chosen_description)
2498 if (val_ret) *val_ret = rp->chosen_description->state.value;
2499 if (rp->chosen_description->state.name)
2500 return rp->chosen_description->state.name;
2505 if (rp->param1.description)
2507 if (val_ret) *val_ret = rp->param1.description->state.value;
2508 if (rp->param1.description->state.name)
2509 return rp->param1.description->state.name;
2513 if (val_ret) *val_ret = 0;
2518 edje_object_part_drag_dir_get(const Evas_Object *obj, const char *part)
2523 ed = _edje_fetch(obj);
2524 if ((!ed) || (!part)) return EDJE_DRAG_DIR_NONE;
2526 /* Need to recalc before providing the object. */
2527 _edje_recalc_do(ed);
2529 rp = _edje_real_part_recursive_get(ed, (char *)part);
2530 if (!rp) return EDJE_DRAG_DIR_NONE;
2531 if ((rp->part->dragable.x) && (rp->part->dragable.y)) return EDJE_DRAG_DIR_XY;
2532 else if (rp->part->dragable.x) return EDJE_DRAG_DIR_X;
2533 else if (rp->part->dragable.y) return EDJE_DRAG_DIR_Y;
2534 return EDJE_DRAG_DIR_NONE;
2538 edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, double dy)
2543 ed = _edje_fetch(obj);
2544 if ((!ed) || (!part)) return EINA_FALSE;
2545 rp = _edje_real_part_recursive_get(ed, (char *)part);
2546 if (!rp) return EINA_FALSE;
2547 if (!rp->drag) return EINA_FALSE;
2548 if (rp->drag->down.count > 0) return EINA_FALSE;
2549 if (rp->part->dragable.confine_id != -1)
2551 dx = CLAMP(dx, 0.0, 1.0);
2552 dy = CLAMP(dy, 0.0, 1.0);
2554 if (rp->part->dragable.x < 0) dx = 1.0 - dx;
2555 if (rp->part->dragable.y < 0) dy = 1.0 - dy;
2556 if ((rp->drag->val.x == FROM_DOUBLE(dx)) && (rp->drag->val.y == FROM_DOUBLE(dy))) return EINA_TRUE;
2557 rp->drag->val.x = FROM_DOUBLE(dx);
2558 rp->drag->val.y = FROM_DOUBLE(dy);
2559 #ifdef EDJE_CALC_CACHE
2562 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
2563 _edje_emit(rp->edje, "drag,set", rp->part->name);
2567 /* FIXME: Should this be x and y instead of dx/dy? */
2569 edje_object_part_drag_value_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
2575 ed = _edje_fetch(obj);
2576 if ((!ed) || (!part))
2583 /* Need to recalc before providing the object. */
2584 _edje_recalc_do(ed);
2586 rp = _edje_real_part_recursive_get(ed, (char *)part);
2587 if (!rp || !rp->drag)
2593 ddx = TO_DOUBLE(rp->drag->val.x);
2594 ddy = TO_DOUBLE(rp->drag->val.y);
2595 if (rp->part->dragable.x < 0) ddx = 1.0 - ddx;
2596 if (rp->part->dragable.y < 0) ddy = 1.0 - ddy;
2603 edje_object_part_drag_size_set(Evas_Object *obj, const char *part, double dw, double dh)
2608 ed = _edje_fetch(obj);
2609 if ((!ed) || (!part)) return EINA_FALSE;
2610 rp = _edje_real_part_recursive_get(ed, (char *)part);
2611 if (!rp) return EINA_FALSE;
2612 if (!rp->drag) return EINA_FALSE;
2613 if (dw < 0.0) dw = 0.0;
2614 else if (dw > 1.0) dw = 1.0;
2615 if (dh < 0.0) dh = 0.0;
2616 else if (dh > 1.0) dh = 1.0;
2617 if ((rp->drag->size.x == FROM_DOUBLE(dw)) && (rp->drag->size.y == FROM_DOUBLE(dh))) return EINA_TRUE;
2618 rp->drag->size.x = FROM_DOUBLE(dw);
2619 rp->drag->size.y = FROM_DOUBLE(dh);
2620 rp->edje->dirty = 1;
2621 #ifdef EDJE_CALC_CACHE
2624 _edje_recalc(rp->edje);
2629 edje_object_part_drag_size_get(const Evas_Object *obj, const char *part, double *dw, double *dh)
2634 ed = _edje_fetch(obj);
2635 if ((!ed) || (!part))
2642 /* Need to recalc before providing the object. */
2643 _edje_recalc_do(ed);
2645 rp = _edje_real_part_recursive_get(ed, (char *)part);
2646 if (!rp || !rp->drag)
2652 if (dw) *dw = TO_DOUBLE(rp->drag->size.x);
2653 if (dh) *dh = TO_DOUBLE(rp->drag->size.y);
2658 edje_object_part_drag_step_set(Evas_Object *obj, const char *part, double dx, double dy)
2663 ed = _edje_fetch(obj);
2664 if ((!ed) || (!part)) return EINA_FALSE;
2665 rp = _edje_real_part_recursive_get(ed, (char *)part);
2666 if (!rp) return EINA_FALSE;
2667 if (!rp->drag) return EINA_FALSE;
2668 if (dx < 0.0) dx = 0.0;
2669 else if (dx > 1.0) dx = 1.0;
2670 if (dy < 0.0) dy = 0.0;
2671 else if (dy > 1.0) dy = 1.0;
2672 rp->drag->step.x = FROM_DOUBLE(dx);
2673 rp->drag->step.y = FROM_DOUBLE(dy);
2674 #ifdef EDJE_CALC_CACHE
2681 edje_object_part_drag_step_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
2686 ed = _edje_fetch(obj);
2687 if ((!ed) || (!part))
2694 /* Need to recalc before providing the object. */
2695 _edje_recalc_do(ed);
2697 rp = _edje_real_part_recursive_get(ed, (char *)part);
2698 if (!rp || !rp->drag)
2704 if (dx) *dx = TO_DOUBLE(rp->drag->step.x);
2705 if (dy) *dy = TO_DOUBLE(rp->drag->step.y);
2710 edje_object_part_drag_page_set(Evas_Object *obj, const char *part, double dx, double dy)
2715 ed = _edje_fetch(obj);
2716 if ((!ed) || (!part)) return EINA_FALSE;
2717 rp = _edje_real_part_recursive_get(ed, (char *)part);
2718 if (!rp) return EINA_FALSE;
2719 if (!rp->drag) return EINA_FALSE;
2720 if (dx < 0.0) dx = 0.0;
2721 else if (dx > 1.0) dx = 1.0;
2722 if (dy < 0.0) dy = 0.0;
2723 else if (dy > 1.0) dy = 1.0;
2724 rp->drag->page.x = FROM_DOUBLE(dx);
2725 rp->drag->page.y = FROM_DOUBLE(dy);
2726 #ifdef EDJE_CALC_CACHE
2733 edje_object_part_drag_page_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
2738 ed = _edje_fetch(obj);
2739 if ((!ed) || (!part))
2746 /* Need to recalc before providing the object. */
2747 _edje_recalc_do(ed);
2749 rp = _edje_real_part_recursive_get(ed, (char *)part);
2750 if (!rp || !rp->drag)
2756 if (dx) *dx = TO_DOUBLE(rp->drag->page.x);
2757 if (dy) *dy = TO_DOUBLE(rp->drag->page.y);
2762 edje_object_part_drag_step(Evas_Object *obj, const char *part, double dx, double dy)
2768 ed = _edje_fetch(obj);
2769 if ((!ed) || (!part)) return EINA_FALSE;
2770 rp = _edje_real_part_recursive_get(ed, (char *)part);
2771 if (!rp) return EINA_FALSE;
2772 if (!rp->drag) return EINA_FALSE;
2773 if (rp->drag->down.count > 0) return EINA_FALSE;
2774 px = rp->drag->val.x;
2775 py = rp->drag->val.y;
2776 rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx),
2777 MUL(rp->drag->step.x, rp->part->dragable.x)));
2778 rp->drag->val.y = ADD(py, MUL(FROM_DOUBLE(dy),
2779 MUL(rp->drag->step.y, rp->part->dragable.y)));
2780 rp->drag->val.x = CLAMP (rp->drag->val.x, ZERO, FROM_DOUBLE(1.0));
2781 rp->drag->val.y = CLAMP (rp->drag->val.y, ZERO, FROM_DOUBLE(1.0));
2782 if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return EINA_TRUE;
2783 #ifdef EDJE_CALC_CACHE
2786 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
2787 _edje_emit(rp->edje, "drag,step", rp->part->name);
2792 edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double dy)
2798 ed = _edje_fetch(obj);
2799 if ((!ed) || (!part)) return EINA_FALSE;
2800 rp = _edje_real_part_recursive_get(ed, (char *)part);
2801 if (!rp) return EINA_FALSE;
2802 if (!rp->drag) return EINA_FALSE;
2803 if (rp->drag->down.count > 0) return EINA_FALSE;
2804 px = rp->drag->val.x;
2805 py = rp->drag->val.y;
2806 rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx), MUL(rp->drag->page.x, rp->part->dragable.x)));
2807 rp->drag->val.y = ADD(py, MUL(FROM_DOUBLE(dy), MUL(rp->drag->page.y, rp->part->dragable.y)));
2808 rp->drag->val.x = CLAMP (rp->drag->val.x, ZERO, FROM_DOUBLE(1.0));
2809 rp->drag->val.y = CLAMP (rp->drag->val.y, ZERO, FROM_DOUBLE(1.0));
2810 if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return EINA_TRUE;
2811 #ifdef EDJE_CALC_CACHE
2814 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
2815 _edje_emit(rp->edje, "drag,page", rp->part->name);
2820 _edje_box_init(void)
2826 _edje_box_shutdown(void)
2828 if (!_edje_box_layout_registry)
2832 (_edje_box_layout_registry, _edje_box_layout_external_free, NULL);
2833 _edje_box_layout_registry = NULL;
2837 edje_object_part_box_append(Evas_Object *obj, const char *part, Evas_Object *child)
2842 ed = _edje_fetch(obj);
2843 if ((!ed) || (!part) || (!child)) return EINA_FALSE;
2845 rp = _edje_real_part_recursive_get(ed, part);
2846 if (!rp) return EINA_FALSE;
2847 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
2849 return _edje_real_part_box_append(rp, child);
2853 edje_object_part_box_prepend(Evas_Object *obj, const char *part, Evas_Object *child)
2858 ed = _edje_fetch(obj);
2859 if ((!ed) || (!part)) return EINA_FALSE;
2861 rp = _edje_real_part_recursive_get(ed, part);
2862 if (!rp) return EINA_FALSE;
2863 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
2865 return _edje_real_part_box_prepend(rp, child);
2869 edje_object_part_box_insert_before(Evas_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference)
2874 ed = _edje_fetch(obj);
2875 if ((!ed) || (!part)) return EINA_FALSE;
2877 rp = _edje_real_part_recursive_get(ed, part);
2878 if (!rp) return EINA_FALSE;
2879 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
2881 return _edje_real_part_box_insert_before(rp, child, reference);
2885 edje_object_part_box_insert_at(Evas_Object *obj, const char *part, Evas_Object *child, unsigned int pos)
2890 ed = _edje_fetch(obj);
2891 if ((!ed) || (!part)) return EINA_FALSE;
2893 rp = _edje_real_part_recursive_get(ed, part);
2894 if (!rp) return EINA_FALSE;
2895 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
2897 return _edje_real_part_box_insert_at(rp, child, pos);
2901 edje_object_part_box_remove(Evas_Object *obj, const char *part, Evas_Object *child)
2906 ed = _edje_fetch(obj);
2907 if ((!ed) || (!part)) return NULL;
2909 rp = _edje_real_part_recursive_get(ed, part);
2910 if (!rp) return NULL;
2911 if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
2913 return _edje_real_part_box_remove(rp, child);
2917 edje_object_part_box_remove_at(Evas_Object *obj, const char *part, unsigned int pos)
2922 ed = _edje_fetch(obj);
2923 if ((!ed) || (!part)) return NULL;
2925 rp = _edje_real_part_recursive_get(ed, part);
2926 if (!rp) return NULL;
2927 if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
2929 return _edje_real_part_box_remove_at(rp, pos);
2933 edje_object_part_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool clear)
2938 ed = _edje_fetch(obj);
2939 if ((!ed) || (!part)) return EINA_FALSE;
2941 rp = _edje_real_part_recursive_get(ed, part);
2942 if (!rp) return EINA_FALSE;
2943 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
2945 return _edje_real_part_box_remove_all(rp, clear);
2950 _edje_box_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
2952 Edje_Real_Part *rp = data;
2954 rp->edje->dirty = 1;
2955 #ifdef EDJE_CALC_CACHE
2958 _edje_recalc(rp->edje);
2962 _edje_box_child_add(Edje_Real_Part *rp, Evas_Object *child)
2964 evas_object_event_callback_add
2965 (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
2967 rp->edje->dirty = 1;
2968 #ifdef EDJE_CALC_CACHE
2971 _edje_recalc(rp->edje);
2975 _edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child)
2977 evas_object_event_callback_del_full
2978 (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
2980 rp->edje->dirty = 1;
2981 #ifdef EDJE_CALC_CACHE
2984 _edje_recalc(rp->edje);
2988 _edje_real_part_box_append(Edje_Real_Part *rp, Evas_Object *child_obj)
2990 Evas_Object_Box_Option *opt;
2992 opt = evas_object_box_append(rp->object, child_obj);
2993 if (!opt) return EINA_FALSE;
2995 if (!_edje_box_layout_add_child(rp, child_obj))
2997 evas_object_box_remove(rp->object, child_obj);
3001 _edje_box_child_add(rp, child_obj);
3007 _edje_real_part_box_prepend(Edje_Real_Part *rp, Evas_Object *child_obj)
3009 Evas_Object_Box_Option *opt;
3011 opt = evas_object_box_prepend(rp->object, child_obj);
3012 if (!opt) return EINA_FALSE;
3014 if (!_edje_box_layout_add_child(rp, child_obj))
3016 evas_object_box_remove(rp->object, child_obj);
3020 _edje_box_child_add(rp, child_obj);
3026 _edje_real_part_box_insert_before(Edje_Real_Part *rp, Evas_Object *child_obj, const Evas_Object *ref)
3028 Evas_Object_Box_Option *opt;
3030 opt = evas_object_box_insert_before(rp->object, child_obj, ref);
3031 if (!opt) return EINA_FALSE;
3033 if (!_edje_box_layout_add_child(rp, child_obj))
3035 evas_object_box_remove(rp->object, child_obj);
3039 _edje_box_child_add(rp, child_obj);
3045 _edje_real_part_box_insert_at(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned int pos)
3047 Evas_Object_Box_Option *opt;
3049 opt = evas_object_box_insert_at(rp->object, child_obj, pos);
3050 if (!opt) return EINA_FALSE;
3052 if (!_edje_box_layout_add_child(rp, child_obj))
3054 evas_object_box_remove(rp->object, child_obj);
3058 _edje_box_child_add(rp, child_obj);
3064 _edje_real_part_box_remove(Edje_Real_Part *rp, Evas_Object *child_obj)
3066 if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL;
3067 if (!evas_object_box_remove(rp->object, child_obj)) return NULL;
3068 _edje_box_layout_remove_child(rp, child_obj);
3069 _edje_box_child_remove(rp, child_obj);
3074 _edje_real_part_box_remove_at(Edje_Real_Part *rp, unsigned int pos)
3076 Evas_Object_Box_Option *opt;
3077 Evas_Object_Box_Data *priv;
3078 Evas_Object *child_obj;
3080 priv = evas_object_smart_data_get(rp->object);
3081 opt = eina_list_nth(priv->children, pos);
3082 if (!opt) return NULL;
3083 child_obj = opt->obj;
3084 if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL;
3085 if (!evas_object_box_remove_at(rp->object, pos)) return NULL;
3086 _edje_box_layout_remove_child(rp, child_obj);
3087 _edje_box_child_remove(rp, child_obj);
3092 _edje_real_part_box_remove_all(Edje_Real_Part *rp, Eina_Bool clear)
3094 Eina_List *children;
3097 children = evas_object_box_children_get(rp->object);
3100 Evas_Object *child_obj = children->data;
3101 if (evas_object_data_get(child_obj, "\377 edje.box_item"))
3105 _edje_box_layout_remove_child(rp, child_obj);
3106 _edje_box_child_remove(rp, child_obj);
3107 if (!evas_object_box_remove_at(rp->object, i))
3110 evas_object_del(child_obj);
3112 children = eina_list_remove_list(children, children);
3118 _edje_table_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
3120 Edje_Real_Part *rp = data;
3122 rp->edje->dirty = 1;
3123 #ifdef EDJE_CALC_CACHE
3126 _edje_recalc(rp->edje);
3130 _edje_table_child_add(Edje_Real_Part *rp, Evas_Object *child)
3132 evas_object_event_callback_add
3133 (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
3135 rp->edje->dirty = 1;
3136 #ifdef EDJE_CALC_CACHE
3139 _edje_recalc(rp->edje);
3143 _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child)
3145 evas_object_event_callback_del_full
3146 (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
3148 rp->edje->dirty = 1;
3149 #ifdef EDJE_CALC_CACHE
3152 _edje_recalc(rp->edje);
3156 edje_object_part_table_child_get(Evas_Object *obj, const char *part, unsigned int col, unsigned int row)
3161 ed = _edje_fetch(obj);
3162 if ((!ed) || (!part)) return NULL;
3164 rp = _edje_real_part_recursive_get(ed, part);
3165 if (!rp) return NULL;
3166 if (rp->part->type != EDJE_PART_TYPE_TABLE) return NULL;
3168 return evas_object_table_child_get(rp->object, col, row);
3172 edje_object_part_table_pack(Evas_Object *obj, const char *part, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
3177 ed = _edje_fetch(obj);
3178 if ((!ed) || (!part)) return EINA_FALSE;
3180 rp = _edje_real_part_recursive_get(ed, part);
3181 if (!rp) return EINA_FALSE;
3182 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
3184 return _edje_real_part_table_pack(rp, child_obj, col, row, colspan, rowspan);
3188 edje_object_part_table_unpack(Evas_Object *obj, const char *part, Evas_Object *child_obj)
3193 ed = _edje_fetch(obj);
3194 if ((!ed) || (!part)) return EINA_FALSE;
3196 rp = _edje_real_part_recursive_get(ed, part);
3197 if (!rp) return EINA_FALSE;
3198 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
3200 return _edje_real_part_table_unpack(rp, child_obj);
3204 edje_object_part_table_col_row_size_get(const Evas_Object *obj, const char *part, int *cols, int *rows)
3209 ed = _edje_fetch(obj);
3210 if ((!ed) || (!part)) return EINA_FALSE;
3212 rp = _edje_real_part_recursive_get(ed, part);
3213 if (!rp) return EINA_FALSE;
3214 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
3216 evas_object_table_col_row_size_get(rp->object, cols, rows);
3221 edje_object_part_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear)
3226 ed = _edje_fetch(obj);
3227 if ((!ed) || (!part)) return EINA_FALSE;
3229 rp = _edje_real_part_recursive_get(ed, part);
3230 if (!rp) return EINA_FALSE;
3231 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
3233 _edje_real_part_table_clear(rp, clear);
3238 _edje_perspective_obj_del(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object *obj, __UNUSED__ void *event_info)
3240 Edje_Perspective *ps = data;
3243 EINA_LIST_FREE(ps->users, o)
3247 ed = evas_object_smart_data_get(o);
3251 _edje_recalc_do(ed);
3256 EAPI Edje_Perspective *
3257 edje_perspective_new(Evas *e)
3259 Edje_Perspective *ps;
3260 Evas_Coord vx, vy, vw, vh;
3262 if (!e) return NULL;
3263 ps = calloc(1, sizeof(Edje_Perspective));
3264 ps->obj = evas_object_rectangle_add(e);
3265 evas_object_data_set(ps->obj, "_edje_perspective", ps);
3266 evas_object_event_callback_add(ps->obj, EVAS_CALLBACK_DEL, _edje_perspective_obj_del, ps);
3267 evas_output_viewport_get(e, &vx, &vy, &vw, &vh);
3269 ps->px = vx + (vw / 2);
3270 ps->py = vy + (vh / 2);
3277 edje_perspective_free(Edje_Perspective *ps)
3280 evas_object_del(ps->obj);
3284 edje_perspective_set(Edje_Perspective *ps, Evas_Coord px, Evas_Coord py, Evas_Coord z0, Evas_Coord foc)
3290 if ((ps->px == px) && (ps->py == py) && (ps->z0 == z0) && (ps->foc == foc)) return;
3295 EINA_LIST_FOREACH(ps->users, l, o)
3299 ed = evas_object_smart_data_get(o);
3304 _edje_recalc_do(ed);
3309 EINA_LIST_FOREACH(_edje_edjes, l, o)
3313 ed = evas_object_smart_data_get(o);
3318 _edje_recalc_do(ed);
3325 edje_perspective_global_set(Edje_Perspective *ps, Eina_Bool global)
3331 if (ps->global == global) return;
3334 o = evas_object_name_find(evas_object_evas_get(ps->obj),
3335 "_edje_perspective");
3336 if (o) evas_object_name_set(o, NULL);
3337 evas_object_name_set(ps->obj, "_edje_perspective");
3340 evas_object_name_set(ps->obj, NULL);
3341 ps->global = global;
3342 EINA_LIST_FOREACH(_edje_edjes, l, o)
3346 ed = evas_object_smart_data_get(o);
3351 _edje_recalc_do(ed);
3357 edje_perspective_global_get(const Edje_Perspective *ps)
3359 if (!ps) return EINA_FALSE;
3363 EAPI const Edje_Perspective *
3364 edje_evas_global_perspective_get(const Evas *e)
3368 if (!e) return NULL;
3369 obj = evas_object_name_find(e, "_edje_perspective");
3370 if (!obj) return NULL;
3371 return evas_object_data_get(obj, "_edje_perspective");
3375 edje_object_perspective_set(Evas_Object *obj, Edje_Perspective *ps)
3379 ed = evas_object_smart_data_get(obj);
3381 if (ed->persp == ps) return;
3382 if (ed->persp != ps)
3385 ed->persp->users = eina_list_remove(ed->persp->users, obj);
3388 if (ps) ps->users = eina_list_append(ps->users, obj);
3390 _edje_recalc_do(ed);
3393 EAPI const Edje_Perspective *
3394 edje_object_perspective_get(const Evas_Object *obj)
3398 ed = evas_object_smart_data_get(obj);
3399 if (!ed) return NULL;
3403 #define EDJE_PRELOAD_EMISSION "preload,done"
3404 #define EDJE_PRELOAD_SOURCE NULL
3407 edje_object_preload(Evas_Object *obj, Eina_Bool cancel)
3413 ed = _edje_fetch(obj);
3414 if (!ed) return EINA_FALSE;
3416 _edje_recalc_do(ed);
3418 for (i = 0, count = 0; i < ed->table_parts_size; i++)
3423 rp = ed->table_parts[i];
3426 if (ep->type == EDJE_PART_TYPE_IMAGE ||
3427 (ep->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object))
3431 ed->preload_count = count;
3435 for (i = 0; i < ed->table_parts_size; i++)
3440 rp = ed->table_parts[i];
3443 if (ep->type == EDJE_PART_TYPE_IMAGE)
3445 const char *file = NULL;
3446 const char *key = NULL;
3448 evas_object_event_callback_del_full(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
3450 evas_object_image_file_get(rp->object, &file, &key);
3453 ed->preload_count--;
3457 evas_object_event_callback_add(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
3458 evas_object_image_preload(rp->object, cancel);
3462 else if (ep->type == EDJE_PART_TYPE_GROUP)
3464 if (rp->swallowed_object) {
3465 edje_object_signal_callback_del(rp->swallowed_object, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb);
3466 edje_object_signal_callback_add(rp->swallowed_object, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb, ed);
3467 edje_object_preload(rp->swallowed_object, cancel);
3476 _edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
3483 _edje_real_part_table_pack(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
3486 evas_object_table_pack(rp->object, child_obj, col, row, colspan, rowspan);
3488 _edje_table_child_add(rp, child_obj);
3494 _edje_real_part_table_unpack(Edje_Real_Part *rp, Evas_Object *child_obj)
3496 Eina_Bool ret = evas_object_table_unpack(rp->object, child_obj);
3499 _edje_table_child_remove(rp, child_obj);
3505 _edje_real_part_table_clear(Edje_Real_Part *rp, Eina_Bool clear)
3507 Eina_List *children;
3509 children = evas_object_table_children_get(rp->object);
3512 Evas_Object *child_obj = children->data;
3514 _edje_table_child_remove(rp, child_obj);
3515 if (!evas_object_data_get(child_obj, "\377 edje.table_item"))
3517 evas_object_table_unpack(rp->object, child_obj);
3519 evas_object_del(child_obj);
3521 children = eina_list_remove_list(children, children);
3526 _edje_real_part_recursive_get(const Edje *ed, const char *part)
3531 path = eina_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
3532 if (!path) return NULL;
3534 rp = _edje_real_part_recursive_get_helper(ed, path);
3542 _edje_children_get(Edje_Real_Part *rp, const char *partid)
3549 if (!partid) return NULL;
3551 switch (rp->part->type)
3553 case EDJE_PART_TYPE_EXTERNAL:
3554 return _edje_external_content_get(rp->swallowed_object, partid);
3555 case EDJE_PART_TYPE_BOX:
3556 l = evas_object_box_children_get(rp->object);
3558 case EDJE_PART_TYPE_TABLE:
3559 l = evas_object_table_children_get(rp->object);
3565 v = strtol(partid, &p, 10);
3566 if ((*p == '\0') && (v >= 0))
3568 child = eina_list_nth(l, v);
3574 EINA_LIST_FREE(l, cur)
3576 const char *name = evas_object_name_get(cur);
3577 if ((name) && (!strcmp(name, partid)))
3589 /* rebuild alternative path */
3591 _edje_merge_path(const char *alias, char * const *path)
3594 unsigned int length = 1;
3595 unsigned int alias_length;
3598 if (!alias) return NULL;
3600 alias_length = strlen(alias);
3602 for (i = 0; path[i]; i++)
3603 length += strlen(path[i]) + 1;
3605 tmp = malloc(sizeof (char) * (length + alias_length + 2));
3606 memcpy(tmp, alias, alias_length);
3607 tmp[alias_length] = '\0';
3609 for (i = 0; path[i]; i++)
3611 strcat(tmp, EDJE_PART_PATH_SEPARATOR_STRING);
3612 strcat(tmp, path[i]);
3620 _edje_real_part_recursive_get_helper(const Edje *ed, char **path)
3629 if (ed->collection && ed->collection->alias)
3633 alias = _edje_merge_path(eina_hash_find(ed->collection->alias, path[0]), path + 1);
3635 rp = _edje_real_part_recursive_get(ed, alias);
3641 //printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
3642 idx = strchr(path[0], EDJE_PART_PATH_SEPARATOR_INDEXL);
3647 end = strchr(idx + 1, EDJE_PART_PATH_SEPARATOR_INDEXR);
3656 rp = _edje_real_part_get(ed, path[0]);
3657 if (!path[1] && !idx) return rp;
3658 if (!rp) return NULL;
3660 switch (rp->part->type)
3662 case EDJE_PART_TYPE_GROUP:
3663 if (!rp->swallowed_object) return NULL;
3664 ed = _edje_fetch(rp->swallowed_object);
3665 if (!ed) return NULL;
3667 return _edje_real_part_recursive_get_helper(ed, path);
3668 case EDJE_PART_TYPE_BOX:
3669 case EDJE_PART_TYPE_TABLE:
3670 case EDJE_PART_TYPE_EXTERNAL:
3671 if (!idx) return rp;
3674 child = _edje_children_get(rp, idx);
3676 ed = _edje_fetch(child);
3678 if (!ed) return NULL;
3679 return _edje_real_part_recursive_get_helper(ed, path);
3685 /* Private Routines */
3687 _edje_real_part_get(const Edje *ed, const char *part)
3691 if (!part) return NULL;
3693 for (i = 0; i < ed->table_parts_size; i++)
3697 rp = ed->table_parts[i];
3698 if ((rp->part->name) && (!strcmp(rp->part->name, part))) return rp;
3704 _edje_color_class_find(Edje *ed, const char *color_class)
3707 Edje_Color_Class *cc = NULL;
3709 if ((!ed) || (!color_class)) return NULL;
3711 /* first look through the object scope */
3712 EINA_LIST_FOREACH(ed->color_classes, l, cc)
3713 if ((cc->name) && (!strcmp(color_class, cc->name))) return cc;
3715 /* next look through the global scope */
3716 cc = eina_hash_find(_edje_color_class_hash, color_class);
3719 /* finally, look through the file scope */
3720 EINA_LIST_FOREACH(ed->file->color_classes, l, cc)
3721 if ((cc->name) && (!strcmp(color_class, cc->name))) return cc;
3727 _edje_color_class_member_add(Edje *ed, const char *color_class)
3729 _edje_class_member_add(ed, &ed->members.color_class, &_edje_color_class_member_hash, color_class);
3733 _edje_color_class_member_direct_del(const char *color_class, void *l)
3735 _edje_class_member_direct_del(color_class, l, _edje_color_class_member_hash);
3739 _edje_color_class_member_del(Edje *ed, const char *color_class)
3741 if ((!ed) || (!color_class)) return;
3743 _edje_class_member_del(&ed->members.color_class, &_edje_color_class_member_hash, color_class);
3747 _edje_color_class_members_free(void)
3749 if (!_edje_color_class_member_hash) return;
3750 eina_hash_foreach(_edje_color_class_member_hash, member_list_free, NULL);
3751 eina_hash_free(_edje_color_class_member_hash);
3752 _edje_color_class_member_hash = NULL;
3756 color_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
3758 Edje_Color_Class *cc;
3761 if (cc->name) eina_stringshare_del(cc->name);
3767 _edje_color_class_hash_free(void)
3769 if (!_edje_color_class_hash) return;
3770 eina_hash_foreach(_edje_color_class_hash, color_class_hash_list_free, NULL);
3771 eina_hash_free(_edje_color_class_hash);
3772 _edje_color_class_hash = NULL;
3776 _edje_color_class_on_del(Edje *ed, Edje_Part *ep)
3780 if ((ep->default_desc) && (ep->default_desc->color_class))
3781 _edje_color_class_member_del(ed, ep->default_desc->color_class);
3783 for (i = 0; i < ep->other.desc_count; ++i)
3784 if (ep->other.desc[i]->color_class)
3785 _edje_color_class_member_del(ed, ep->other.desc[i]->color_class);
3789 _edje_text_class_find(Edje *ed, const char *text_class)
3792 Edje_Text_Class *tc;
3794 if ((!ed) || (!text_class)) return NULL;
3795 EINA_LIST_FOREACH(ed->text_classes, l, tc)
3796 if ((tc->name) && (!strcmp(text_class, tc->name))) return tc;
3797 return eina_hash_find(_edje_text_class_hash, text_class);
3801 _edje_text_class_member_direct_del(const char *text_class,
3804 _edje_class_member_direct_del(text_class, l, _edje_text_class_member_hash);
3808 _edje_text_class_member_add(Edje *ed, const char *text_class)
3810 _edje_class_member_add(ed, &ed->members.text_class, &_edje_text_class_member_hash, text_class);
3814 _edje_text_class_member_del(Edje *ed, const char *text_class)
3816 if ((!ed) || (!text_class)) return;
3818 _edje_class_member_del(&ed->members.text_class, &_edje_text_class_member_hash, text_class);
3822 _edje_text_class_members_free(void)
3824 _edje_class_members_free(&_edje_text_class_member_hash);
3828 text_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
3830 Edje_Text_Class *tc;
3833 if (tc->name) eina_stringshare_del(tc->name);
3834 if (tc->font) eina_stringshare_del(tc->font);
3840 _edje_text_class_hash_free(void)
3842 if (!_edje_text_class_hash) return;
3843 eina_hash_foreach(_edje_text_class_hash, text_class_hash_list_free, NULL);
3844 eina_hash_free(_edje_text_class_hash);
3845 _edje_text_class_hash = NULL;
3849 _edje_fetch(const Evas_Object *obj)
3853 if (!evas_object_smart_type_check(obj, "edje"))
3855 ed = evas_object_smart_data_get(obj);
3856 if ((ed) && (ed->delete_me)) return NULL;
3861 _edje_freeze(Edje *ed)
3864 // printf("FREEZE %i\n", ed->freeze);
3869 _edje_thaw(Edje *ed)
3874 // printf("-------------########### OVER THAW\n");
3877 if ((ed->freeze == 0) && (ed->recalc))
3879 // printf("thaw recalc\n");
3886 _edje_block(Edje *ed)
3894 _edje_unblock(Edje *ed)
3898 if (!ed) return ret;
3901 if (ed->block == 0) ed->block_break = 0;
3908 _edje_block_break(Edje *ed)
3910 if (ed->block_break) return 1;
3915 _edje_block_violate(Edje *ed)
3917 if (ed->block > 0) ed->block_break = 1;
3921 _edje_object_part_swallow_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
3923 Evas_Object *edje_obj;
3926 edje_object_part_unswallow(edje_obj, obj);
3931 _edje_real_part_swallow_hints_update(Edje_Real_Part *rp)
3935 type = evas_object_type_get(rp->swallowed_object);
3937 rp->swallow_params.min.w = 0;
3938 rp->swallow_params.min.h = 0;
3939 rp->swallow_params.max.w = -1;
3940 rp->swallow_params.max.h = -1;
3941 if ((type) && (!strcmp(type, "edje")))
3945 edje_object_size_min_get(rp->swallowed_object, &w, &h);
3946 rp->swallow_params.min.w = w;
3947 rp->swallow_params.min.h = h;
3948 edje_object_size_max_get(rp->swallowed_object, &w, &h);
3949 rp->swallow_params.max.w = w;
3950 rp->swallow_params.max.h = h;
3952 else if ((type) && ((!strcmp(type, "text")) || (!strcmp(type, "polygon")) ||
3953 (!strcmp(type, "line"))))
3957 evas_object_geometry_get(rp->swallowed_object, NULL, NULL, &w, &h);
3958 rp->swallow_params.min.w = w;
3959 rp->swallow_params.min.h = h;
3960 rp->swallow_params.max.w = w;
3961 rp->swallow_params.max.h = h;
3964 Evas_Coord w1, h1, w2, h2, aw, ah;
3965 Evas_Aspect_Control am;
3967 evas_object_size_hint_min_get(rp->swallowed_object, &w1, &h1);
3968 evas_object_size_hint_max_get(rp->swallowed_object, &w2, &h2);
3969 evas_object_size_hint_aspect_get(rp->swallowed_object, &am, &aw, &ah);
3970 rp->swallow_params.min.w = w1;
3971 rp->swallow_params.min.h = h1;
3972 if (w2 > 0) rp->swallow_params.max.w = w2;
3973 if (h2 > 0) rp->swallow_params.max.h = h2;
3976 case EVAS_ASPECT_CONTROL_NONE:
3977 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NONE;
3979 case EVAS_ASPECT_CONTROL_NEITHER:
3980 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NEITHER;
3982 case EVAS_ASPECT_CONTROL_HORIZONTAL:
3983 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_HORIZONTAL;
3985 case EVAS_ASPECT_CONTROL_VERTICAL:
3986 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_VERTICAL;
3988 case EVAS_ASPECT_CONTROL_BOTH:
3989 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_BOTH;
3994 rp->swallow_params.aspect.w = aw;
3995 rp->swallow_params.aspect.h = ah;
3996 evas_object_data_set(rp->swallowed_object, "\377 edje.swallowing_part", rp);
3999 #ifdef EDJE_CALC_CACHE
4005 _edje_object_part_swallow_changed_hints_cb(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object *obj, __UNUSED__ void *event_info)
4010 _edje_real_part_swallow_hints_update(rp);
4011 rp->edje->dirty = 1;
4012 _edje_recalc(rp->edje);
4017 _edje_real_part_swallow(Edje_Real_Part *rp,
4018 Evas_Object *obj_swallow,
4019 Eina_Bool hints_update)
4021 if (rp->swallowed_object)
4023 if (rp->swallowed_object != obj_swallow)
4025 _edje_real_part_swallow_clear(rp);
4026 rp->swallowed_object = NULL;
4031 _edje_real_part_swallow_hints_update(rp);
4032 rp->edje->dirty = 1;
4033 _edje_recalc(rp->edje);
4037 #ifdef EDJE_CALC_CACHE
4040 if (!obj_swallow) return;
4041 rp->swallowed_object = obj_swallow;
4042 evas_object_smart_member_add(rp->swallowed_object, rp->edje->obj);
4044 evas_object_clip_set(rp->swallowed_object, rp->clip_to->object);
4045 else evas_object_clip_set(rp->swallowed_object, rp->edje->base.clipper);
4046 evas_object_stack_above(rp->swallowed_object, rp->object);
4047 evas_object_event_callback_add(rp->swallowed_object,
4049 _edje_object_part_swallow_free_cb,
4051 evas_object_event_callback_add(rp->swallowed_object,
4052 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
4053 _edje_object_part_swallow_changed_hints_cb,
4057 _edje_real_part_swallow_hints_update(rp);
4059 if (rp->part->mouse_events)
4061 _edje_callbacks_add(obj_swallow, rp->edje, rp);
4062 if (rp->part->repeat_events)
4063 evas_object_repeat_events_set(obj_swallow, 1);
4064 if (rp->part->pointer_mode != EVAS_OBJECT_POINTER_MODE_AUTOGRAB)
4065 evas_object_pointer_mode_set(obj_swallow, rp->part->pointer_mode);
4066 evas_object_pass_events_set(obj_swallow, 0);
4069 evas_object_pass_events_set(obj_swallow, 1);
4070 _edje_callbacks_focus_add(rp->swallowed_object, rp->edje, rp);
4072 if (rp->part->precise_is_inside)
4073 evas_object_precise_is_inside_set(obj_swallow, 1);
4075 rp->edje->dirty = 1;
4076 _edje_recalc(rp->edje);
4080 _edje_real_part_swallow_clear(Edje_Real_Part *rp)
4082 evas_object_smart_member_del(rp->swallowed_object);
4083 evas_object_event_callback_del_full(rp->swallowed_object,
4085 _edje_object_part_swallow_free_cb,
4087 evas_object_event_callback_del_full(rp->swallowed_object,
4088 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
4089 _edje_object_part_swallow_changed_hints_cb,
4091 evas_object_clip_unset(rp->swallowed_object);
4092 evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
4093 if (rp->part->mouse_events)
4094 _edje_callbacks_del(rp->swallowed_object, rp->edje);
4095 _edje_callbacks_focus_del(rp->swallowed_object, rp->edje);
4099 _edje_object_preload(Edje *ed)
4101 ed->preload_count--;
4102 if (!ed->preload_count)
4103 _edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
4107 _edje_object_image_preload_cb(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info)
4111 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
4112 _edje_object_preload(ed);
4116 _edje_object_signal_preload_cb(void *data, Evas_Object *obj, __UNUSED__ const char *emission, __UNUSED__ const char *source)
4120 edje_object_signal_callback_del(obj, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb);
4121 _edje_object_preload(ed);
4130 _edje_program_remove(Edje_Part_Collection *edc, Edje_Program *p)
4132 Edje_Program ***array;
4133 unsigned int *count;
4136 if (!p->signal && !p->source)
4138 array = &edc->programs.nocmp;
4139 count = &edc->programs.nocmp_count;
4141 else if (p->signal && !strpbrk(p->signal, "*?[\\")
4142 && p->source && !strpbrk(p->source, "*?[\\"))
4144 array = &edc->programs.strcmp;
4145 count = &edc->programs.strcmp_count;
4147 else if (p->signal && edje_program_is_strncmp(p->signal)
4148 && p->source && edje_program_is_strncmp(p->source))
4150 array = &edc->programs.strncmp;
4151 count = &edc->programs.strncmp_count;
4153 else if (p->signal && edje_program_is_strrncmp(p->signal)
4154 && p->source && edje_program_is_strrncmp(p->source))
4156 array = &edc->programs.strrncmp;
4157 count = &edc->programs.strrncmp_count;
4161 array = &edc->programs.fnmatch;
4162 count = &edc->programs.fnmatch_count;
4165 for (i = 0; i < *count; ++i)
4166 if ((*array)[i] == p)
4168 memmove(*array + i, *array + i + 1, sizeof (Edje_Program *) * (*count - i -1));
4180 _edje_program_insert(Edje_Part_Collection *edc, Edje_Program *p)
4182 Edje_Program ***array;
4183 unsigned int *count;
4185 if (!p->signal && !p->source)
4187 array = &edc->programs.nocmp;
4188 count = &edc->programs.nocmp_count;
4190 else if (p->signal && !strpbrk(p->signal, "*?[\\")
4191 && p->source && !strpbrk(p->source, "*?[\\"))
4193 array = &edc->programs.strcmp;
4194 count = &edc->programs.strcmp_count;
4196 else if (p->signal && edje_program_is_strncmp(p->signal)
4197 && p->source && edje_program_is_strncmp(p->source))
4199 array = &edc->programs.strncmp;
4200 count = &edc->programs.strncmp_count;
4202 else if (p->signal && edje_program_is_strrncmp(p->signal)
4203 && p->source && edje_program_is_strrncmp(p->source))
4205 array = &edc->programs.strrncmp;
4206 count = &edc->programs.strrncmp_count;
4210 array = &edc->programs.fnmatch;
4211 count = &edc->programs.fnmatch_count;
4214 *array = realloc(*array, sizeof (Edje_Program *) * (*count + 1));
4215 (*array)[(*count)++] = p;
4219 edje_string_get(const Edje_String *es)
4221 /* FIXME: Handle localization here */
4222 if (!es) return NULL;
4227 edje_string_id_get(const Edje_String *es)
4229 /* FIXME: Handle localization here */
4230 if (!es) return NULL;
4235 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/