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 int _edje_freeze_val = 0;
26 int _edje_freeze_calc_count = 0;
27 Eina_List *_edje_freeze_calc_list = NULL;
29 typedef struct _Edje_List_Foreach_Data Edje_List_Foreach_Data;
30 struct _Edje_List_Foreach_Data
35 static Eina_Bool _edje_color_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
36 static Eina_Bool _edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
37 static void _edje_object_image_preload_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
38 static void _edje_object_signal_preload_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
40 Edje_Real_Part *_edje_real_part_recursive_get_helper(const Edje *ed, char **path);
42 /************************** API Routines **************************/
51 INF("fr ++ ->%i", _edje_freeze_val);
53 // FIXME: could just have a global freeze instead of per object
54 // above i tried.. but this broke some things. notable e17's menus. why?
58 EINA_LIST_FOREACH(_edje_edjes, l, data)
59 edje_object_freeze(data);
65 _edje_thaw_edje(Edje *ed)
69 for (i = 0; i < ed->table_parts_size; i++)
73 rp = ed->table_parts[i];
74 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
78 ed2 = _edje_fetch(rp->swallowed_object);
79 if (ed2) _edje_thaw_edje(ed2);
82 if ((ed->recalc) && (ed->freeze <= 0)) _edje_recalc_do(ed);
91 INF("fr -- ->%i", _edje_freeze_val);
92 if ((_edje_freeze_val <= 0) && (_edje_freeze_calc_count > 0))
96 _edje_freeze_calc_count = 0;
97 EINA_LIST_FREE(_edje_freeze_calc_list, ed)
106 // FIXME: could just have a global freeze instead of per object
107 // comment as above.. why?
110 EINA_LIST_FOREACH(_edje_edjes, l, data)
111 edje_object_thaw(data);
116 edje_fontset_append_set(const char *fonts)
118 if (_edje_fontset_append)
119 free(_edje_fontset_append);
120 _edje_fontset_append = fonts ? strdup(fonts) : NULL;
124 edje_fontset_append_get(void)
126 return _edje_fontset_append;
130 edje_scale_set(double scale)
135 if (_edje_scale == FROM_DOUBLE(scale)) return;
136 _edje_scale = FROM_DOUBLE(scale);
137 EINA_LIST_FOREACH(_edje_edjes, l, data)
138 edje_object_calc_force(data);
144 return TO_DOUBLE(_edje_scale);
148 edje_object_scale_set(Evas_Object *obj, double scale)
152 ed = _edje_fetch(obj);
153 if (!ed) return EINA_FALSE;
154 if (ed->scale == scale) return EINA_TRUE;
155 ed->scale = FROM_DOUBLE(scale);
156 edje_object_calc_force(obj);
161 edje_object_scale_get(const Evas_Object *obj)
165 ed = _edje_fetch(obj);
167 return TO_DOUBLE(ed->scale);
171 edje_object_mirrored_get(const Evas_Object *obj)
175 ed = _edje_fetch(obj);
176 if (!ed) return EINA_FALSE;
182 _edje_object_orientation_inform(Evas_Object *obj)
184 if (edje_object_mirrored_get(obj))
185 edje_object_signal_emit(obj, "edje,state,rtl", "edje");
187 edje_object_signal_emit(obj, "edje,state,ltr", "edje");
191 edje_object_mirrored_set(Evas_Object *obj, Eina_Bool rtl)
196 ed = _edje_fetch(obj);
198 if (ed->is_rtl == rtl) return;
202 for (i = 0 ; i < ed->table_parts_size ; i++)
208 ep = ed->table_parts[i];
209 s = ep->param1.description->state.name,
210 v = ep->param1.description->state.value;
211 _edje_part_description_apply(ed, ep, s, v , NULL, 0.0);
212 ep->chosen_description = ep->param1.description;
216 _edje_object_orientation_inform(obj);
222 edje_object_data_get(const Evas_Object *obj, const char *key)
226 ed = _edje_fetch(obj);
229 if (!ed->collection) return NULL;
230 if (!ed->collection->data) return NULL;
231 return edje_string_get(eina_hash_find(ed->collection->data, key));
235 edje_object_freeze(Evas_Object *obj)
240 ed = _edje_fetch(obj);
242 for (i = 0; i < ed->table_parts_size; i++)
245 rp = ed->table_parts[i];
246 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
247 edje_object_freeze(rp->swallowed_object);
249 return _edje_freeze(ed);
253 edje_object_thaw(Evas_Object *obj)
258 ed = _edje_fetch(obj);
260 for (i = 0; i < ed->table_parts_size; i++)
264 rp = ed->table_parts[i];
265 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
266 edje_object_thaw(rp->swallowed_object);
268 return _edje_thaw(ed);
272 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)
275 Edje_Color_Class *cc;
277 if (!color_class) return EINA_FALSE;
279 cc = eina_hash_find(_edje_color_class_hash, color_class);
282 cc = calloc(1, sizeof(Edje_Color_Class));
283 if (!cc) return EINA_FALSE;
284 cc->name = eina_stringshare_add(color_class);
290 if (!_edje_color_class_hash)
291 _edje_color_class_hash = eina_hash_string_superfast_new(NULL);
292 eina_hash_add(_edje_color_class_hash, color_class, cc);
296 else if (r > 255) r = 255;
298 else if (g > 255) g = 255;
300 else if (b > 255) b = 255;
302 else if (a > 255) a = 255;
303 if ((cc->r == r) && (cc->g == g) &&
304 (cc->b == b) && (cc->a == a) &&
305 (cc->r2 == r2) && (cc->g2 == g2) &&
306 (cc->b2 == b2) && (cc->a2 == a2) &&
307 (cc->r3 == r3) && (cc->g3 == g3) &&
308 (cc->b3 == b3) && (cc->a3 == a3))
323 members = eina_hash_find(_edje_color_class_member_hash, color_class);
328 ed = eina_list_data_get(members);
330 #ifdef EDJE_CALC_CACHE
331 ed->all_part_change = 1;
334 _edje_emit(ed, "color_class,set", color_class);
335 members = eina_list_next(members);
341 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)
343 Edje_Color_Class *cc;
348 cc = eina_hash_find(_edje_color_class_hash, color_class);
352 #define X(C) if (C) *C = cc->C
353 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
363 #define X(C) if (C) *C = 0
364 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
375 edje_color_class_del(const char *color_class)
377 Edje_Color_Class *cc;
380 if (!color_class) return;
382 cc = eina_hash_find(_edje_color_class_hash, color_class);
385 eina_hash_del(_edje_color_class_hash, color_class, cc);
386 eina_stringshare_del(cc->name);
389 members = eina_hash_find(_edje_color_class_member_hash, color_class);
394 ed = eina_list_data_get(members);
396 #ifdef EDJE_CALC_CACHE
397 ed->all_part_change = 1;
400 _edje_emit(ed, "color_class,del", color_class);
401 members = eina_list_next(members);
406 edje_color_class_list(void)
408 Edje_List_Foreach_Data fdata;
410 memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
411 eina_hash_foreach(_edje_color_class_member_hash,
412 _edje_color_class_list_foreach, &fdata);
418 _edje_color_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
420 Edje_List_Foreach_Data *fd;
423 fd->list = eina_list_append(fd->list, strdup(key));
428 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)
432 Edje_Color_Class *cc;
435 ed = _edje_fetch(obj);
436 if ((!ed) || (!color_class)) return EINA_FALSE;
438 else if (r > 255) r = 255;
440 else if (g > 255) g = 255;
442 else if (b > 255) b = 255;
444 else if (a > 255) a = 255;
445 color_class = eina_stringshare_add(color_class);
446 if (!color_class) return EINA_FALSE;
447 EINA_LIST_FOREACH(ed->color_classes, l, cc)
449 if (cc->name == color_class)
451 eina_stringshare_del(color_class);
453 if ((cc->r == r) && (cc->g == g) &&
454 (cc->b == b) && (cc->a == a) &&
455 (cc->r2 == r2) && (cc->g2 == g2) &&
456 (cc->b2 == b2) && (cc->a2 == a2) &&
457 (cc->r3 == r3) && (cc->g3 == g3) &&
458 (cc->b3 == b3) && (cc->a3 == a3))
473 #ifdef EDJE_CALC_CACHE
474 ed->all_part_change = 1;
480 cc = malloc(sizeof(Edje_Color_Class));
483 eina_stringshare_del(color_class);
486 cc->name = color_class;
499 ed->color_classes = eina_list_append(ed->color_classes, cc);
501 #ifdef EDJE_CALC_CACHE
502 ed->all_part_change = 1;
505 for (i = 0; i < ed->table_parts_size; i++)
509 rp = ed->table_parts[i];
510 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
511 edje_object_color_class_set(rp->swallowed_object, color_class,
512 r, g, b, a, r2, g2, b2, a2, r3, g3, b3,
517 _edje_emit(ed, "color_class,set", color_class);
522 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)
524 Edje *ed = _edje_fetch(obj);
525 Edje_Color_Class *cc = _edje_color_class_find(ed, color_class);
529 #define X(C) if (C) *C = cc->C
530 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
540 #define X(C) if (C) *C = 0
541 #define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
552 edje_object_color_class_del(Evas_Object *obj, const char *color_class)
556 Edje_Color_Class *cc = NULL;
559 if (!color_class) return;
561 ed = _edje_fetch(obj);
562 EINA_LIST_FOREACH(ed->color_classes, l, cc)
564 if (!strcmp(cc->name, color_class))
566 ed->color_classes = eina_list_remove(ed->color_classes, cc);
567 eina_stringshare_del(cc->name);
573 for (i = 0; i < ed->table_parts_size; i++)
577 rp = ed->table_parts[i];
578 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
579 edje_object_color_class_del(rp->swallowed_object, color_class);
583 #ifdef EDJE_CALC_CACHE
584 ed->all_part_change = 1;
587 _edje_emit(ed, "color_class,del", color_class);
591 edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size size)
596 if (!text_class) return EINA_FALSE;
597 if (!font) font = "";
599 tc = eina_hash_find(_edje_text_class_hash, text_class);
600 /* Create new text class */
603 tc = calloc(1, sizeof(Edje_Text_Class));
604 if (!tc) return EINA_FALSE;
605 tc->name = eina_stringshare_add(text_class);
611 if (!_edje_text_class_hash) _edje_text_class_hash = eina_hash_string_superfast_new(NULL);
612 eina_hash_add(_edje_text_class_hash, text_class, tc);
614 tc->font = eina_stringshare_add(font);
619 /* If the class found is the same just return */
620 if ((tc->size == size) && (tc->font) && (!strcmp(tc->font, font)))
623 /* Update the class found */
624 eina_stringshare_del(tc->font);
625 tc->font = eina_stringshare_add(font);
628 eina_hash_del(_edje_text_class_hash, text_class, tc);
634 /* Tell all members of the text class to recalc */
635 members = eina_hash_find(_edje_text_class_member_hash, text_class);
640 ed = eina_list_data_get(members);
642 _edje_textblock_style_all_update(ed);
643 #ifdef EDJE_CALC_CACHE
644 ed->text_part_change = 1;
647 members = eina_list_next(members);
653 edje_text_class_del(const char *text_class)
658 if (!text_class) return;
660 tc = eina_hash_find(_edje_text_class_hash, text_class);
663 eina_hash_del(_edje_text_class_hash, text_class, tc);
664 eina_stringshare_del(tc->name);
665 eina_stringshare_del(tc->font);
668 members = eina_hash_find(_edje_text_class_member_hash, text_class);
673 ed = eina_list_data_get(members);
675 _edje_textblock_style_all_update(ed);
676 #ifdef EDJE_CALC_CACHE
677 ed->text_part_change = 1;
680 members = eina_list_next(members);
685 edje_text_class_list(void)
687 Edje_List_Foreach_Data fdata;
689 memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
690 eina_hash_foreach(_edje_text_class_member_hash,
691 _edje_text_class_list_foreach, &fdata);
696 _edje_text_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
698 Edje_List_Foreach_Data *fd;
701 fd->list = eina_list_append(fd->list, eina_stringshare_add(key));
706 edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char *font, Evas_Font_Size size)
713 ed = _edje_fetch(obj);
714 if ((!ed) || (!text_class)) return EINA_FALSE;
716 /* for each text_class in the edje */
717 EINA_LIST_FOREACH(ed->text_classes, l, tc)
719 if ((tc->name) && (!strcmp(tc->name, text_class)))
721 /* Match and the same, return */
722 if ((tc->font) && (font) && (!strcmp(tc->font, font)) &&
726 /* No font but size is the same, return */
727 if ((!tc->font) && (!font) && (tc->size == size)) return EINA_TRUE;
729 /* Update new text class properties */
730 if (tc->font) eina_stringshare_del(tc->font);
731 if (font) tc->font = eina_stringshare_add(font);
732 else tc->font = NULL;
737 #ifdef EDJE_CALC_CACHE
738 ed->text_part_change = 1;
745 /* No matches, create a new text class */
746 tc = calloc(1, sizeof(Edje_Text_Class));
747 if (!tc) return EINA_FALSE;
748 tc->name = eina_stringshare_add(text_class);
754 if (font) tc->font = eina_stringshare_add(font);
755 else tc->font = NULL;
758 for (i = 0; i < ed->table_parts_size; i++)
762 rp = ed->table_parts[i];
763 if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
764 edje_object_text_class_set(rp->swallowed_object, text_class,
768 /* Add to edje's text class list */
769 ed->text_classes = eina_list_append(ed->text_classes, tc);
771 #ifdef EDJE_CALC_CACHE
772 ed->text_part_change = 1;
774 _edje_textblock_style_all_update(ed);
780 edje_object_part_exists(const Evas_Object *obj, const char *part)
785 ed = _edje_fetch(obj);
786 if ((!ed) || (!part)) return EINA_FALSE;
787 rp = _edje_real_part_recursive_get(ed, (char *)part);
788 if (!rp) return EINA_FALSE;
792 EAPI const Evas_Object *
793 edje_object_part_object_get(const Evas_Object *obj, const char *part)
798 ed = _edje_fetch(obj);
799 if ((!ed) || (!part)) return NULL;
801 /* Need to recalc before providing the object. */
804 rp = _edje_real_part_recursive_get(ed, (char *)part);
805 if (!rp) return NULL;
810 edje_object_part_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h )
815 ed = _edje_fetch(obj);
816 if ((!ed) || (!part))
825 /* Need to recalc before providing the object. */
828 rp = _edje_real_part_recursive_get(ed, (char *)part);
845 edje_object_item_provider_set(Evas_Object *obj, Edje_Item_Provider_Cb func, void *data)
849 ed = _edje_fetch(obj);
851 ed->item_provider.func = func;
852 ed->item_provider.data = data;
855 /* FIXDOC: New Function */
857 edje_object_text_change_cb_set(Evas_Object *obj, Edje_Text_Change_Cb func, void *data)
862 ed = _edje_fetch(obj);
864 ed->text_change.func = func;
865 ed->text_change.data = data;
867 for (i = 0; i < ed->table_parts_size; i++)
871 rp = ed->table_parts[i];
872 if ((rp->part->type == EDJE_PART_TYPE_GROUP) && (rp->swallowed_object))
873 edje_object_text_change_cb_set(rp->swallowed_object, func, data);
878 _edje_object_part_text_raw_set(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text)
880 if ((!rp->text.text) && (!text))
882 if ((rp->text.text) && (text) &&
883 (!strcmp(rp->text.text, text)))
887 eina_stringshare_del(rp->text.text);
888 rp->text.text = NULL;
890 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
891 _edje_entry_text_markup_set(rp, text);
893 if (text) rp->text.text = eina_stringshare_add(text);
895 #ifdef EDJE_CALC_CACHE
898 _edje_recalc(rp->edje);
899 if (rp->edje->text_change.func)
900 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
905 _edje_object_part_text_raw_append(Evas_Object *obj, Edje_Real_Part *rp, const char *part, const char *text)
907 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
908 _edje_entry_text_markup_append(rp, text);
914 int len_added = strlen(text);
915 int len_old = strlen(rp->text.text);
916 new = malloc(len_old + len_added + 1);
917 memcpy(new, rp->text.text, len_old);
918 memcpy(new + len_old, text, len_added);
919 new[len_old + len_added] = '\0';
920 eina_stringshare_replace(&rp->text.text, new);
925 eina_stringshare_replace(&rp->text.text, text);
929 #ifdef EDJE_CALC_CACHE
932 _edje_recalc(rp->edje);
933 if (rp->edje->text_change.func)
934 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
938 /** Sets the text for an object part
939 * @param obj A valid Evas Object handle
940 * @param part The part name
941 * @param text The text string
944 edje_object_part_text_set(Evas_Object *obj, const char *part, const char *text)
949 ed = _edje_fetch(obj);
950 if ((!ed) || (!part)) return EINA_FALSE;
951 rp = _edje_real_part_recursive_get(ed, (char *)part);
952 if (!rp) return EINA_FALSE;
953 if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
954 (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return EINA_FALSE;
955 return _edje_object_part_text_raw_set(obj, rp, part, text);
959 edje_object_part_text_get(const Evas_Object *obj, const char *part)
964 ed = _edje_fetch(obj);
965 if ((!ed) || (!part)) return NULL;
967 /* Need to recalc before providing the object. */
970 rp = _edje_real_part_recursive_get(ed, (char *)part);
971 if (!rp) return NULL;
972 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
973 return _edje_entry_text_get(rp);
976 if (rp->part->type == EDJE_PART_TYPE_TEXT) return rp->text.text;
977 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
978 return evas_object_textblock_text_markup_get(rp->object);
984 _edje_text_escape(const char *text)
988 const char *text_end;
991 if (!text) return NULL;
993 txt = eina_strbuf_new();
994 text_len = strlen(text);
996 text_end = text + text_len;
997 while (text < text_end)
1000 const char *escaped = evas_textblock_string_escape_get(text, &advance);
1003 eina_strbuf_append_char(txt, text[0]);
1007 eina_strbuf_append(txt, escaped);
1012 ret = eina_strbuf_string_steal(txt);
1013 eina_strbuf_free(txt);
1018 _edje_text_unescape(const char *text)
1022 const char *text_end, *last, *escape_start;
1025 if (!text) return NULL;
1027 txt = eina_strbuf_new();
1028 text_len = strlen(text);
1030 text_end = text + text_len;
1032 escape_start = NULL;
1033 for (; text < text_end; text++)
1047 len = text - escape_start;
1052 eina_strbuf_append_n(txt, str, len);
1054 escape_start = text;
1057 else if ((*text == ';') && (escape_start))
1060 const char *str = evas_textblock_escape_string_range_get(escape_start, text);
1067 len = text + 1 - escape_start;
1070 eina_strbuf_append_n(txt, str, len);
1072 escape_start = NULL;
1077 if (!last && escape_start)
1078 last = escape_start;
1080 if (last && (text > last))
1082 size_t len = text - last;
1083 eina_strbuf_append_n(txt, last, len);
1086 ret = eina_strbuf_string_steal(txt);
1087 eina_strbuf_free(txt);
1092 edje_object_part_text_unescaped_set(Evas_Object *obj, const char *part, const char *text_to_escape)
1096 Eina_Bool ret = EINA_FALSE;
1098 ed = _edje_fetch(obj);
1099 if ((!ed) || (!part)) return ret;
1100 rp = _edje_real_part_recursive_get(ed, part);
1101 if (!rp) return ret;
1102 if (rp->part->type == EDJE_PART_TYPE_TEXT)
1103 ret = _edje_object_part_text_raw_set(obj, rp, part, text_to_escape);
1104 else if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1106 char *text = _edje_text_escape(text_to_escape);
1108 ret = _edje_object_part_text_raw_set(obj, rp, part, text);
1115 edje_object_part_text_unescaped_get(const Evas_Object *obj, const char *part)
1120 ed = _edje_fetch(obj);
1121 if ((!ed) || (!part)) return NULL;
1123 /* Need to recalc before providing the object. */
1124 _edje_recalc_do(ed);
1126 rp = _edje_real_part_recursive_get(ed, (char *)part);
1127 if (!rp) return NULL;
1128 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1130 const char *t = _edje_entry_text_get(rp);
1131 return _edje_text_unescape(t);
1135 if (rp->part->type == EDJE_PART_TYPE_TEXT) return strdup(rp->text.text);
1136 if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
1138 const char *t = evas_object_textblock_text_markup_get(rp->object);
1139 return _edje_text_unescape(t);
1146 edje_object_part_text_selection_get(const Evas_Object *obj, const char *part)
1151 ed = _edje_fetch(obj);
1152 if ((!ed) || (!part)) return NULL;
1153 rp = _edje_real_part_recursive_get(ed, (char *)part);
1154 if (!rp) return NULL;
1155 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1156 return _edje_entry_selection_get(rp);
1161 edje_object_part_text_select_none(const Evas_Object *obj, const char *part)
1166 ed = _edje_fetch(obj);
1167 if ((!ed) || (!part)) return;
1168 rp = _edje_real_part_recursive_get(ed, (char *)part);
1170 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1171 _edje_entry_select_none(rp);
1175 edje_object_part_text_select_all(const Evas_Object *obj, const char *part)
1180 ed = _edje_fetch(obj);
1181 if ((!ed) || (!part)) return;
1182 rp = _edje_real_part_recursive_get(ed, (char *)part);
1184 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1185 _edje_entry_select_all(rp);
1189 edje_object_part_text_insert(Evas_Object *obj, const char *part, const char *text)
1194 ed = _edje_fetch(obj);
1195 if ((!ed) || (!part)) return;
1196 rp = _edje_real_part_recursive_get(ed, (char *)part);
1198 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
1199 if (rp->part->entry_mode <= EDJE_ENTRY_EDIT_MODE_NONE) return;
1200 _edje_entry_text_markup_insert(rp, text);
1201 rp->edje->dirty = 1;
1202 #ifdef EDJE_CALC_CACHE
1205 _edje_recalc(rp->edje);
1206 if (rp->edje->text_change.func)
1207 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1211 edje_object_part_text_append(Evas_Object *obj, const char *part, const char *text)
1216 ed = _edje_fetch(obj);
1217 if ((!ed) || (!part)) return;
1218 rp = _edje_real_part_recursive_get(ed, (char *)part);
1220 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return;
1221 _edje_object_part_text_raw_append(obj, rp, part, text);
1222 rp->edje->dirty = 1;
1223 #ifdef EDJE_CALC_CACHE
1226 _edje_recalc(rp->edje);
1227 if (rp->edje->text_change.func)
1228 rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
1231 EAPI const Eina_List *
1232 edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part)
1237 ed = _edje_fetch(obj);
1238 if ((!ed) || (!part)) return NULL;
1239 rp = _edje_real_part_recursive_get(ed, (char *)part);
1240 if (!rp) return NULL;
1241 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1242 return _edje_entry_anchors_list(rp);
1246 EAPI const Eina_List *
1247 edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *part, const char *anchor)
1252 ed = _edje_fetch(obj);
1253 if ((!ed) || (!part)) return NULL;
1254 rp = _edje_real_part_recursive_get(ed, (char *)part);
1255 if (!rp) return NULL;
1256 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1257 return _edje_entry_anchor_geometry_get(rp, anchor);
1261 EAPI const Eina_List *
1262 edje_object_part_text_item_list_get(const Evas_Object *obj, const char *part)
1267 ed = _edje_fetch(obj);
1268 if ((!ed) || (!part)) return NULL;
1269 rp = _edje_real_part_recursive_get(ed, (char *)part);
1270 if (!rp) return NULL;
1271 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1272 return _edje_entry_items_list(rp);
1277 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)
1282 ed = _edje_fetch(obj);
1283 if ((!ed) || (!part)) return EINA_FALSE;
1284 rp = _edje_real_part_recursive_get(ed, (char *)part);
1285 if (!rp) return EINA_FALSE;
1286 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1287 return _edje_entry_item_geometry_get(rp, item, cx, cy, cw, ch);
1292 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)
1297 ed = _edje_fetch(obj);
1302 if ((!ed) || (!part)) return;
1303 rp = _edje_real_part_recursive_get(ed, (char *)part);
1305 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1307 _edje_entry_cursor_geometry_get(rp, x, y, w, h);
1308 if (x) *x -= rp->edje->x;
1309 if (y) *y -= rp->edje->y;
1315 edje_object_part_text_select_allow_set(const Evas_Object *obj, const char *part, Eina_Bool allow)
1320 ed = _edje_fetch(obj);
1321 if ((!ed) || (!part)) return;
1322 rp = _edje_real_part_recursive_get(ed, (char *)part);
1324 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1325 _edje_entry_select_allow_set(rp, allow);
1329 edje_object_part_text_select_abort(const Evas_Object *obj, const char *part)
1334 ed = _edje_fetch(obj);
1335 if ((!ed) || (!part)) return;
1336 rp = _edje_real_part_recursive_get(ed, (char *)part);
1338 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1339 _edje_entry_select_abort(rp);
1343 edje_object_part_text_select_begin(const Evas_Object *obj, const char *part)
1348 ed = _edje_fetch(obj);
1349 if ((!ed) || (!part)) return;
1350 rp = _edje_real_part_recursive_get(ed, (char *)part);
1352 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1353 _edje_entry_select_begin(rp);
1357 edje_object_part_text_select_extend(const Evas_Object *obj, const char *part)
1362 ed = _edje_fetch(obj);
1363 if ((!ed) || (!part)) return;
1364 rp = _edje_real_part_recursive_get(ed, (char *)part);
1366 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1367 _edje_entry_select_extend(rp);
1371 edje_object_part_text_cursor_next(Evas_Object *obj, const char *part, Edje_Cursor cur)
1376 ed = _edje_fetch(obj);
1377 if ((!ed) || (!part)) return EINA_FALSE;
1378 rp = _edje_real_part_recursive_get(ed, (char *)part);
1379 if (!rp) return EINA_FALSE;
1380 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1382 return _edje_entry_cursor_next(rp, cur);
1388 edje_object_part_text_cursor_prev(Evas_Object *obj, const char *part, Edje_Cursor cur)
1393 ed = _edje_fetch(obj);
1394 if ((!ed) || (!part)) return EINA_FALSE;
1395 rp = _edje_real_part_recursive_get(ed, (char *)part);
1396 if (!rp) return EINA_FALSE;
1397 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1399 return _edje_entry_cursor_prev(rp, cur);
1405 edje_object_part_text_cursor_up(Evas_Object *obj, const char *part, Edje_Cursor cur)
1410 ed = _edje_fetch(obj);
1411 if ((!ed) || (!part)) return EINA_FALSE;
1412 rp = _edje_real_part_recursive_get(ed, (char *)part);
1413 if (!rp) return EINA_FALSE;
1414 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1416 return _edje_entry_cursor_up(rp, cur);
1422 edje_object_part_text_cursor_down(Evas_Object *obj, const char *part, Edje_Cursor cur)
1427 ed = _edje_fetch(obj);
1428 if ((!ed) || (!part)) return EINA_FALSE;
1429 rp = _edje_real_part_recursive_get(ed, (char *)part);
1430 if (!rp) return EINA_FALSE;
1431 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1433 return _edje_entry_cursor_down(rp, cur);
1439 edje_object_part_text_cursor_begin_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1444 ed = _edje_fetch(obj);
1445 if ((!ed) || (!part)) return;
1446 rp = _edje_real_part_recursive_get(ed, (char *)part);
1448 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1450 _edje_entry_cursor_begin(rp, cur);
1455 edje_object_part_text_cursor_end_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1460 ed = _edje_fetch(obj);
1461 if ((!ed) || (!part)) return;
1462 rp = _edje_real_part_recursive_get(ed, (char *)part);
1464 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1466 _edje_entry_cursor_end(rp, cur);
1471 edje_object_part_text_cursor_copy(Evas_Object *obj, const char *part, Edje_Cursor src, Edje_Cursor dst)
1476 ed = _edje_fetch(obj);
1477 if ((!ed) || (!part)) return;
1478 rp = _edje_real_part_recursive_get(ed, (char *)part);
1480 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1482 _edje_entry_cursor_copy(rp, src, dst);
1487 edje_object_part_text_cursor_line_begin_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1492 ed = _edje_fetch(obj);
1493 if ((!ed) || (!part)) return;
1494 rp = _edje_real_part_recursive_get(ed, (char *)part);
1496 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1498 _edje_entry_cursor_line_begin(rp, cur);
1503 edje_object_part_text_cursor_line_end_set(Evas_Object *obj, const char *part, Edje_Cursor cur)
1508 ed = _edje_fetch(obj);
1509 if ((!ed) || (!part)) return;
1510 rp = _edje_real_part_recursive_get(ed, (char *)part);
1512 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1514 _edje_entry_cursor_line_end(rp, cur);
1519 edje_object_part_text_cursor_coord_set(Evas_Object *obj, const char *part,
1520 Edje_Cursor cur, Evas_Coord x, Evas_Coord y)
1525 ed = _edje_fetch(obj);
1526 if ((!ed) || (!part)) return EINA_FALSE;
1527 rp = _edje_real_part_recursive_get(ed, (char *)part);
1528 if (!rp) return EINA_FALSE;
1529 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1531 return _edje_entry_cursor_coord_set(rp, cur, x, y);
1537 edje_object_part_text_cursor_is_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1542 ed = _edje_fetch(obj);
1543 if ((!ed) || (!part)) return EINA_FALSE;
1544 rp = _edje_real_part_recursive_get(ed, (char *)part);
1545 if (!rp) return EINA_FALSE;
1546 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1548 return _edje_entry_cursor_is_format_get(rp, cur);
1554 edje_object_part_text_cursor_is_visible_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1559 ed = _edje_fetch(obj);
1560 if ((!ed) || (!part)) return 0;
1561 rp = _edje_real_part_recursive_get(ed, (char *)part);
1563 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1565 return _edje_entry_cursor_is_visible_format_get(rp, cur);
1571 edje_object_part_text_cursor_content_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1576 ed = _edje_fetch(obj);
1577 if ((!ed) || (!part)) return NULL;
1578 rp = _edje_real_part_recursive_get(ed, part);
1579 if (!rp) return NULL;
1580 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1582 return _edje_entry_cursor_content_get(rp, cur);
1588 edje_object_part_text_cursor_pos_set(Evas_Object *obj, const char *part, Edje_Cursor cur, int pos)
1593 ed = _edje_fetch(obj);
1594 if ((!ed) || (!part)) return;
1595 rp = _edje_real_part_recursive_get(ed, part);
1597 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1599 _edje_entry_cursor_pos_set(rp, cur, pos);
1604 edje_object_part_text_cursor_pos_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
1609 ed = _edje_fetch(obj);
1610 if ((!ed) || (!part)) return 0;
1611 rp = _edje_real_part_recursive_get(ed, part);
1613 if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
1615 return _edje_entry_cursor_pos_get(rp, cur);
1621 edje_object_text_insert_filter_callback_add(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
1624 Edje_Text_Insert_Filter_Callback *cb;
1626 ed = _edje_fetch(obj);
1627 if ((!ed) || (!part)) return;
1628 cb = calloc(1, sizeof(Edje_Text_Insert_Filter_Callback));
1629 cb->part = eina_stringshare_add(part);
1631 cb->data = (void *)data;
1632 ed->text_insert_filter_callbacks =
1633 eina_list_append(ed->text_insert_filter_callbacks, cb);
1637 edje_object_text_insert_filter_callback_del(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func)
1640 Edje_Text_Insert_Filter_Callback *cb;
1643 ed = _edje_fetch(obj);
1644 if ((!ed) || (!part)) return NULL;
1645 EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
1647 if ((!strcmp(cb->part, part)) && (cb->func == func))
1649 void *data = cb->data;
1650 ed->text_insert_filter_callbacks =
1651 eina_list_remove_list(ed->text_insert_filter_callbacks, l);
1652 eina_stringshare_del(cb->part);
1661 edje_object_text_insert_filter_callback_del_full(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
1664 Edje_Text_Insert_Filter_Callback *cb;
1667 ed = _edje_fetch(obj);
1668 if ((!ed) || (!part)) return NULL;
1669 EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
1671 if ((!strcmp(cb->part, part)) && (cb->func == func) &&
1674 void *data = cb->data;
1675 ed->text_insert_filter_callbacks =
1676 eina_list_remove_list(ed->text_insert_filter_callbacks, l);
1677 eina_stringshare_del(cb->part);
1686 edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_swallow)
1691 ed = _edje_fetch(obj);
1692 if ((!ed) || (!part)) return EINA_FALSE;
1694 /* Need to recalc before providing the object. */
1695 // XXX: I guess this is not required, removing for testing purposes
1696 // XXX: uncomment if you see glitches in e17 or others.
1697 // XXX: by Gustavo, January 21th 2009.
1698 // XXX: I got a backtrace with over 30000 calls without this,
1699 // XXX: only with 32px shelves. The problem is probably somewhere else,
1700 // XXX: but until it's found, leave this here.
1701 // XXX: by Sachiel, January 21th 2009, 19:30 UTC
1702 _edje_recalc_do(ed);
1704 rp = _edje_real_part_recursive_get(ed, (char *)part);
1705 if (!rp) return EINA_FALSE;
1706 if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
1708 ERR("cannot unswallow part %s: not swallow type!", rp->part->name);
1711 _edje_real_part_swallow(rp, obj_swallow, EINA_TRUE);
1716 _recalc_extern_parent(Evas_Object *obj)
1718 Evas_Object *parent;
1721 parent = evas_object_smart_parent_get(obj);
1722 ed = _edje_fetch(parent);
1729 edje_extern_object_min_size_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord minh)
1733 evas_object_size_hint_min_set(obj, minw, minh);
1734 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
1737 rp->swallow_params.min.w = minw;
1738 rp->swallow_params.min.h = minh;
1740 _recalc_extern_parent(obj);
1745 edje_extern_object_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord maxh)
1749 evas_object_size_hint_max_set(obj, maxw, maxh);
1750 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
1753 rp->swallow_params.max.w = maxw;
1754 rp->swallow_params.max.h = maxh;
1756 _recalc_extern_parent(obj);
1761 edje_extern_object_aspect_set(Evas_Object *obj, Edje_Aspect_Control aspect, Evas_Coord aw, Evas_Coord ah)
1764 Evas_Aspect_Control asp;
1766 asp = EVAS_ASPECT_CONTROL_NONE;
1769 case EDJE_ASPECT_CONTROL_NONE: asp = EVAS_ASPECT_CONTROL_NONE; break;
1770 case EDJE_ASPECT_CONTROL_NEITHER: asp = EVAS_ASPECT_CONTROL_NEITHER; break;
1771 case EDJE_ASPECT_CONTROL_HORIZONTAL: asp = EVAS_ASPECT_CONTROL_HORIZONTAL; break;
1772 case EDJE_ASPECT_CONTROL_VERTICAL: asp = EVAS_ASPECT_CONTROL_VERTICAL; break;
1773 case EDJE_ASPECT_CONTROL_BOTH: asp = EVAS_ASPECT_CONTROL_BOTH; break;
1778 evas_object_size_hint_aspect_set(obj, asp, aw, ah);
1779 rp = evas_object_data_get(obj, "\377 edje.swallowing_part");
1782 rp->swallow_params.aspect.mode = aspect;
1783 rp->swallow_params.aspect.w = aw;
1784 rp->swallow_params.aspect.h = ah;
1785 _recalc_extern_parent(obj);
1789 struct edje_box_layout_builtin {
1791 Evas_Object_Box_Layout cb;
1794 static Evas_Object_Box_Layout
1795 _edje_box_layout_builtin_find(const char *name)
1797 const struct edje_box_layout_builtin _edje_box_layout_builtin[] = {
1798 {"horizontal", evas_object_box_layout_horizontal},
1799 {"horizontal_flow", evas_object_box_layout_flow_horizontal},
1800 {"horizontal_homogeneous", evas_object_box_layout_homogeneous_horizontal},
1801 {"horizontal_max", evas_object_box_layout_homogeneous_max_size_horizontal},
1802 {"stack", evas_object_box_layout_stack},
1803 {"vertical", evas_object_box_layout_vertical},
1804 {"vertical_flow", evas_object_box_layout_flow_vertical},
1805 {"vertical_homogeneous", evas_object_box_layout_homogeneous_vertical},
1806 {"vertical_max", evas_object_box_layout_homogeneous_max_size_vertical},
1809 const struct edje_box_layout_builtin *base;
1814 base = _edje_box_layout_builtin + 0;
1817 base = _edje_box_layout_builtin + 4;
1820 base = _edje_box_layout_builtin + 5;
1826 for (; (base->name) && (base->name[0] == name[0]); base++)
1827 if (strcmp(base->name, name) == 0)
1833 static Eina_Rbtree_Direction
1834 _edje_box_layout_external_node_cmp(const Eina_Rbtree *left, const Eina_Rbtree *right, __UNUSED__ void *data)
1836 Edje_Box_Layout *l = (Edje_Box_Layout *)left;
1837 Edje_Box_Layout *r = (Edje_Box_Layout *)right;
1839 if (strcmp(l->name, r->name) < 0)
1840 return EINA_RBTREE_RIGHT;
1842 return EINA_RBTREE_LEFT;
1846 _edje_box_layout_external_find_cmp(const Eina_Rbtree *node, const void *key, __UNUSED__ int length, __UNUSED__ void *data)
1848 Edje_Box_Layout *l = (Edje_Box_Layout *)node;
1849 return strcmp(key, l->name);
1852 static Edje_Box_Layout *
1853 _edje_box_layout_external_find(const char *name)
1855 return (Edje_Box_Layout *)eina_rbtree_inline_lookup
1856 (_edje_box_layout_registry, name, 0, _edje_box_layout_external_find_cmp,
1861 _edje_box_layout_find(const char *name, Evas_Object_Box_Layout *cb, void **data, void (**free_data)(void *data))
1863 const Edje_Box_Layout *l;
1865 if (!name) return EINA_FALSE;
1867 *cb = _edje_box_layout_builtin_find(name);
1875 l = _edje_box_layout_external_find(name);
1876 if (!l) return EINA_FALSE;
1879 *free_data = l->layout_data_free;
1880 if (l->layout_data_get)
1881 *data = l->layout_data_get(l->data);
1889 _edje_box_layout_external_free(Eina_Rbtree *node, __UNUSED__ void *data)
1891 Edje_Box_Layout *l = (Edje_Box_Layout *)node;
1893 if (l->data && l->free_data)
1894 l->free_data(l->data);
1898 static Edje_Box_Layout *
1899 _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)
1904 name_len = strlen(name) + 1;
1905 l = malloc(sizeof(Edje_Box_Layout) + name_len);
1913 l->layout_data_get = layout_data_get;
1914 l->layout_data_free = layout_data_free;
1915 l->free_data = free_data;
1918 memcpy(l->name, name, name_len);
1924 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)
1930 if (_edje_box_layout_builtin_find(name))
1932 ERR("Cannot register layout '%s': would override builtin!",
1935 if (data && free_data) free_data(data);
1939 l = _edje_box_layout_external_find(name);
1944 if (data && free_data) free_data(data);
1948 l = _edje_box_layout_external_new
1949 (name, func, layout_data_get, layout_data_free, free_data, data);
1953 _edje_box_layout_registry = eina_rbtree_inline_insert
1954 (_edje_box_layout_registry, (Eina_Rbtree *)l,
1955 _edje_box_layout_external_node_cmp, NULL);
1961 if (l->data && l->free_data) l->free_data(l->data);
1964 l->layout_data_get = layout_data_get;
1965 l->layout_data_free = layout_data_free;
1966 l->free_data = free_data;
1971 if (data && free_data) free_data(data);
1973 _edje_box_layout_registry = eina_rbtree_inline_remove
1974 (_edje_box_layout_registry, (Eina_Rbtree *)l,
1975 _edje_box_layout_external_node_cmp, NULL);
1976 _edje_box_layout_external_free((Eina_Rbtree *)l, NULL);
1982 edje_object_part_unswallow(Evas_Object *obj __UNUSED__, Evas_Object *obj_swallow)
1986 if (!obj_swallow) return;
1988 rp = (Edje_Real_Part *)evas_object_data_get(obj_swallow, "\377 edje.swallowing_part");
1991 if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
1993 ERR("cannot unswallow part %s: not swallow type!", rp->part->name);
1996 if (rp->swallowed_object == obj_swallow)
1998 evas_object_smart_member_del(rp->swallowed_object);
1999 evas_object_event_callback_del_full(rp->swallowed_object,
2001 _edje_object_part_swallow_free_cb,
2003 evas_object_event_callback_del_full(rp->swallowed_object,
2004 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
2005 _edje_object_part_swallow_changed_hints_cb,
2007 evas_object_clip_unset(rp->swallowed_object);
2008 evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
2010 if (rp->part->mouse_events)
2011 _edje_callbacks_del(rp->swallowed_object, rp->edje);
2012 _edje_callbacks_focus_del(rp->swallowed_object, rp->edje);
2014 rp->swallowed_object = NULL;
2015 rp->swallow_params.min.w = 0;
2016 rp->swallow_params.min.h = 0;
2017 rp->swallow_params.max.w = 0;
2018 rp->swallow_params.max.h = 0;
2019 rp->edje->dirty = 1;
2020 #ifdef EDJE_CALC_CACHE
2023 _edje_recalc_do(rp->edje);
2029 edje_object_part_swallow_get(const Evas_Object *obj, const char *part)
2034 ed = _edje_fetch(obj);
2035 if ((!ed) || (!part)) return NULL;
2037 /* Need to recalc before providing the object. */
2038 _edje_recalc_do(ed);
2040 rp = _edje_real_part_recursive_get(ed, (char *)part);
2041 if (!rp) return NULL;
2042 return rp->swallowed_object;
2046 edje_object_size_min_get(const Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
2050 ed = _edje_fetch(obj);
2051 if ((!ed) || (!ed->collection))
2053 if (minw) *minw = 0;
2054 if (minh) *minh = 0;
2057 if (minw) *minw = ed->collection->prop.min.w;
2058 if (minh) *minh = ed->collection->prop.min.h;
2062 edje_object_size_max_get(const Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *maxh)
2066 ed = _edje_fetch(obj);
2067 if ((!ed) || (!ed->collection))
2069 if (maxw) *maxw = 0;
2070 if (maxh) *maxh = 0;
2074 /* Need to recalc before providing the object. */
2075 _edje_recalc_do(ed);
2077 if (ed->collection->prop.max.w == 0)
2079 /* XXX TODO: convert maxw to 0, fix things that break. */
2080 if (maxw) *maxw = EDJE_INF_MAX_W;
2084 if (maxw) *maxw = ed->collection->prop.max.w;
2086 if (ed->collection->prop.max.h == 0)
2088 /* XXX TODO: convert maxh to 0, fix things that break. */
2089 if (maxh) *maxh = EDJE_INF_MAX_H;
2093 if (maxh) *maxh = ed->collection->prop.max.h;
2098 edje_object_calc_force(Evas_Object *obj)
2103 ed = _edje_fetch(obj);
2106 #ifdef EDJE_CALC_CACHE
2107 ed->all_part_change = 1;
2110 pf2 = _edje_freeze_val;
2113 _edje_freeze_val = 0;
2116 _edje_recalc_do(ed);
2119 _edje_freeze_val = pf2;
2123 edje_object_size_min_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh)
2125 edje_object_size_min_restricted_calc(obj, minw, minh, 0, 0);
2128 /** Calculate the geometry used by all parts
2129 * @param obj A valid Evas_Object handle
2130 * @param x The x coordinate pointer
2131 * @param y The y coordinate pointer
2132 * @param w The width pointer
2133 * @param h The height pointer
2135 * Calculates the geometry used by all object parts. Including out of bounds parts.
2138 edje_object_parts_extends_calc(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
2141 Evas_Coord x1 = INT_MAX, y1 = INT_MAX;
2142 Evas_Coord x2 = 0, y2 = 0;
2145 ed = _edje_fetch(obj);
2157 /* Need to recalc before providing the object. */
2159 _edje_recalc_do(ed);
2161 for (i = 0; i < ed->table_parts_size; i++)
2164 Evas_Coord rpx1, rpy1;
2165 Evas_Coord rpx2, rpy2;
2167 rp = ed->table_parts[i];
2171 rpx2 = rpx1 + rp->w;
2172 rpy2 = rpy1 + rp->h;
2174 if (x1 > rpx1) x1 = rpx1;
2175 if (y1 > rpy1) y1 = rpy1;
2176 if (x2 < rpx2) x2 = rpx2;
2177 if (y2 < rpy2) y2 = rpy2;
2190 /** Calculate minimum size
2191 * @param obj A valid Evas_Object handle
2192 * @param minw Minimum width pointer
2193 * @param minh Minimum height pointer
2194 * @param restrictedw Do not allow object min width calc to be less than this
2195 * @param restrictedh Do not allow object min height calc to be less than this
2197 * Calculates the object's minimum size. Be advised that invisible parts *ARE*
2198 * taken into account in this calculation, if you don't want that to happen,
2202 edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh, Evas_Coord restrictedw, Evas_Coord restrictedh)
2209 Edje_Real_Part *pep = NULL;
2210 Eina_Bool has_non_fixed_tb = EINA_FALSE;
2212 ed = _edje_fetch(obj);
2213 if ((!ed) || (!ed->collection))
2215 if (minw) *minw = restrictedw;
2216 if (minh) *minh = restrictedh;
2225 ed->w = restrictedw;
2226 ed->h = restrictedh;
2237 #ifdef EDJE_CALC_CACHE
2238 ed->all_part_change = 1;
2240 _edje_recalc_do(ed);
2247 for (i = 0; i < ed->table_parts_size; i++)
2253 ep = ed->table_parts[i];
2254 w = ep->w - ep->req.w;
2255 h = ep->h - ep->req.h;
2257 if (ep->chosen_description)
2259 if (!ep->chosen_description->fixed.w)
2261 if ((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK))
2264 evas_object_textblock_size_formatted_get(ep->object,
2271 has_non_fixed_tb = EINA_TRUE;
2281 if (!ep->chosen_description->fixed.h)
2283 if (!((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) &&
2284 (!((Edje_Part_Description_Text *)ep->chosen_description)->text.min_x) &&
2295 if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)
2297 has_non_fixed_tb = EINA_TRUE;
2305 if (ed->w < restrictedw) ed->w = restrictedw;
2310 if (ed->h < restrictedh) ed->h = restrictedh;
2312 if ((ed->w > 4000) || (ed->h > 4000))
2314 /* Only print it if we have a non-fixed textblock.
2315 * We should possibly avoid all of this if in this case, but in
2316 * the meanwhile, just doing this. */
2317 if (!has_non_fixed_tb)
2320 ERR("file %s, group %s has a non-fixed part '%s'. Adding 'fixed: 1 1;' to source EDC may help. Continuing discarding faulty part.",
2321 ed->path, ed->group, pep->part->name);
2323 ERR("file %s, group %s overflowed 4000x4000 with minimum size of %dx%d. Continuing discarding faulty parts.",
2324 ed->path, ed->group, ed->w, ed->h);
2338 if (minw) *minw = ed->min.w;
2339 if (minh) *minh = ed->min.h;
2344 #ifdef EDJE_CALC_CACHE
2345 ed->all_part_change = 1;
2351 /* FIXME: Correctly return other states */
2353 edje_object_part_state_get(const Evas_Object *obj, const char *part, double *val_ret)
2358 ed = _edje_fetch(obj);
2359 if ((!ed) || (!part))
2361 if (val_ret) *val_ret = 0;
2365 /* Need to recalc before providing the object. */
2366 _edje_recalc_do(ed);
2368 rp = _edje_real_part_recursive_get(ed, (char *)part);
2371 if (val_ret) *val_ret = 0;
2372 INF("part not found");
2375 if (rp->chosen_description)
2377 if (val_ret) *val_ret = rp->chosen_description->state.value;
2378 if (rp->chosen_description->state.name)
2379 return rp->chosen_description->state.name;
2384 if (rp->param1.description)
2386 if (val_ret) *val_ret = rp->param1.description->state.value;
2387 if (rp->param1.description->state.name)
2388 return rp->param1.description->state.name;
2392 if (val_ret) *val_ret = 0;
2397 edje_object_part_drag_dir_get(const Evas_Object *obj, const char *part)
2402 ed = _edje_fetch(obj);
2403 if ((!ed) || (!part)) return EDJE_DRAG_DIR_NONE;
2405 /* Need to recalc before providing the object. */
2406 _edje_recalc_do(ed);
2408 rp = _edje_real_part_recursive_get(ed, (char *)part);
2409 if (!rp) return EDJE_DRAG_DIR_NONE;
2410 if ((rp->part->dragable.x) && (rp->part->dragable.y)) return EDJE_DRAG_DIR_XY;
2411 else if (rp->part->dragable.x) return EDJE_DRAG_DIR_X;
2412 else if (rp->part->dragable.y) return EDJE_DRAG_DIR_Y;
2413 return EDJE_DRAG_DIR_NONE;
2417 edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, double dy)
2422 ed = _edje_fetch(obj);
2423 if ((!ed) || (!part)) return EINA_FALSE;
2424 rp = _edje_real_part_recursive_get(ed, (char *)part);
2425 if (!rp) return EINA_FALSE;
2426 if (!rp->drag) return EINA_FALSE;
2427 if (rp->drag->down.count > 0) return EINA_FALSE;
2428 if (rp->part->dragable.confine_id != -1)
2430 dx = CLAMP(dx, 0.0, 1.0);
2431 dy = CLAMP(dy, 0.0, 1.0);
2433 if (rp->part->dragable.x < 0) dx = 1.0 - dx;
2434 if (rp->part->dragable.y < 0) dy = 1.0 - dy;
2435 if ((rp->drag->val.x == FROM_DOUBLE(dx)) && (rp->drag->val.y == FROM_DOUBLE(dy))) return EINA_TRUE;
2436 rp->drag->val.x = FROM_DOUBLE(dx);
2437 rp->drag->val.y = FROM_DOUBLE(dy);
2438 #ifdef EDJE_CALC_CACHE
2441 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
2442 _edje_emit(rp->edje, "drag,set", rp->part->name);
2446 /* FIXME: Should this be x and y instead of dx/dy? */
2448 edje_object_part_drag_value_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
2454 ed = _edje_fetch(obj);
2455 if ((!ed) || (!part))
2462 /* Need to recalc before providing the object. */
2463 _edje_recalc_do(ed);
2465 rp = _edje_real_part_recursive_get(ed, (char *)part);
2466 if (!rp || !rp->drag)
2472 ddx = TO_DOUBLE(rp->drag->val.x);
2473 ddy = TO_DOUBLE(rp->drag->val.y);
2474 if (rp->part->dragable.x < 0) ddx = 1.0 - ddx;
2475 if (rp->part->dragable.y < 0) ddy = 1.0 - ddy;
2482 edje_object_part_drag_size_set(Evas_Object *obj, const char *part, double dw, double dh)
2487 ed = _edje_fetch(obj);
2488 if ((!ed) || (!part)) return EINA_FALSE;
2489 rp = _edje_real_part_recursive_get(ed, (char *)part);
2490 if (!rp) return EINA_FALSE;
2491 if (!rp->drag) return EINA_FALSE;
2492 if (dw < 0.0) dw = 0.0;
2493 else if (dw > 1.0) dw = 1.0;
2494 if (dh < 0.0) dh = 0.0;
2495 else if (dh > 1.0) dh = 1.0;
2496 if ((rp->drag->size.x == FROM_DOUBLE(dw)) && (rp->drag->size.y == FROM_DOUBLE(dh))) return EINA_TRUE;
2497 rp->drag->size.x = FROM_DOUBLE(dw);
2498 rp->drag->size.y = FROM_DOUBLE(dh);
2499 rp->edje->dirty = 1;
2500 #ifdef EDJE_CALC_CACHE
2503 _edje_recalc(rp->edje);
2508 edje_object_part_drag_size_get(const Evas_Object *obj, const char *part, double *dw, double *dh)
2513 ed = _edje_fetch(obj);
2514 if ((!ed) || (!part))
2521 /* Need to recalc before providing the object. */
2522 _edje_recalc_do(ed);
2524 rp = _edje_real_part_recursive_get(ed, (char *)part);
2525 if (!rp || !rp->drag)
2531 if (dw) *dw = TO_DOUBLE(rp->drag->size.x);
2532 if (dh) *dh = TO_DOUBLE(rp->drag->size.y);
2537 edje_object_part_drag_step_set(Evas_Object *obj, const char *part, double dx, double dy)
2542 ed = _edje_fetch(obj);
2543 if ((!ed) || (!part)) return EINA_FALSE;
2544 rp = _edje_real_part_recursive_get(ed, (char *)part);
2545 if (!rp) return EINA_FALSE;
2546 if (!rp->drag) return EINA_FALSE;
2547 if (dx < 0.0) dx = 0.0;
2548 else if (dx > 1.0) dx = 1.0;
2549 if (dy < 0.0) dy = 0.0;
2550 else if (dy > 1.0) dy = 1.0;
2551 rp->drag->step.x = FROM_DOUBLE(dx);
2552 rp->drag->step.y = FROM_DOUBLE(dy);
2553 #ifdef EDJE_CALC_CACHE
2560 edje_object_part_drag_step_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
2565 ed = _edje_fetch(obj);
2566 if ((!ed) || (!part))
2573 /* Need to recalc before providing the object. */
2574 _edje_recalc_do(ed);
2576 rp = _edje_real_part_recursive_get(ed, (char *)part);
2577 if (!rp || !rp->drag)
2583 if (dx) *dx = TO_DOUBLE(rp->drag->step.x);
2584 if (dy) *dy = TO_DOUBLE(rp->drag->step.y);
2589 edje_object_part_drag_page_set(Evas_Object *obj, const char *part, double dx, double dy)
2594 ed = _edje_fetch(obj);
2595 if ((!ed) || (!part)) return EINA_FALSE;
2596 rp = _edje_real_part_recursive_get(ed, (char *)part);
2597 if (!rp) return EINA_FALSE;
2598 if (!rp->drag) return EINA_FALSE;
2599 if (dx < 0.0) dx = 0.0;
2600 else if (dx > 1.0) dx = 1.0;
2601 if (dy < 0.0) dy = 0.0;
2602 else if (dy > 1.0) dy = 1.0;
2603 rp->drag->page.x = FROM_DOUBLE(dx);
2604 rp->drag->page.y = FROM_DOUBLE(dy);
2605 #ifdef EDJE_CALC_CACHE
2612 edje_object_part_drag_page_get(const Evas_Object *obj, const char *part, double *dx, double *dy)
2617 ed = _edje_fetch(obj);
2618 if ((!ed) || (!part))
2625 /* Need to recalc before providing the object. */
2626 _edje_recalc_do(ed);
2628 rp = _edje_real_part_recursive_get(ed, (char *)part);
2629 if (!rp || !rp->drag)
2635 if (dx) *dx = TO_DOUBLE(rp->drag->page.x);
2636 if (dy) *dy = TO_DOUBLE(rp->drag->page.y);
2641 edje_object_part_drag_step(Evas_Object *obj, const char *part, double dx, double dy)
2647 ed = _edje_fetch(obj);
2648 if ((!ed) || (!part)) return EINA_FALSE;
2649 rp = _edje_real_part_recursive_get(ed, (char *)part);
2650 if (!rp) return EINA_FALSE;
2651 if (!rp->drag) return EINA_FALSE;
2652 if (rp->drag->down.count > 0) return EINA_FALSE;
2653 px = rp->drag->val.x;
2654 py = rp->drag->val.y;
2655 rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx),
2656 MUL(rp->drag->step.x, rp->part->dragable.x)));
2657 rp->drag->val.y = ADD(py, MUL(FROM_DOUBLE(dy),
2658 MUL(rp->drag->step.y, rp->part->dragable.y)));
2659 rp->drag->val.x = CLAMP (rp->drag->val.x, ZERO, FROM_DOUBLE(1.0));
2660 rp->drag->val.y = CLAMP (rp->drag->val.y, ZERO, FROM_DOUBLE(1.0));
2661 if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return EINA_TRUE;
2662 #ifdef EDJE_CALC_CACHE
2665 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
2666 _edje_emit(rp->edje, "drag,step", rp->part->name);
2671 edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double dy)
2677 ed = _edje_fetch(obj);
2678 if ((!ed) || (!part)) return EINA_FALSE;
2679 rp = _edje_real_part_recursive_get(ed, (char *)part);
2680 if (!rp) return EINA_FALSE;
2681 if (!rp->drag) return EINA_FALSE;
2682 if (rp->drag->down.count > 0) return EINA_FALSE;
2683 px = rp->drag->val.x;
2684 py = rp->drag->val.y;
2685 rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx), MUL(rp->drag->page.x, rp->part->dragable.x)));
2686 rp->drag->val.y = ADD(py, MUL(FROM_DOUBLE(dy), MUL(rp->drag->page.y, rp->part->dragable.y)));
2687 rp->drag->val.x = CLAMP (rp->drag->val.x, ZERO, FROM_DOUBLE(1.0));
2688 rp->drag->val.y = CLAMP (rp->drag->val.y, ZERO, FROM_DOUBLE(1.0));
2689 if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return EINA_TRUE;
2690 #ifdef EDJE_CALC_CACHE
2693 _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
2694 _edje_emit(rp->edje, "drag,page", rp->part->name);
2699 _edje_box_init(void)
2705 _edje_box_shutdown(void)
2707 if (!_edje_box_layout_registry)
2711 (_edje_box_layout_registry, _edje_box_layout_external_free, NULL);
2712 _edje_box_layout_registry = NULL;
2716 edje_object_part_box_append(Evas_Object *obj, const char *part, Evas_Object *child)
2721 ed = _edje_fetch(obj);
2722 if ((!ed) || (!part) || (!child)) return EINA_FALSE;
2724 rp = _edje_real_part_recursive_get(ed, part);
2725 if (!rp) return EINA_FALSE;
2726 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
2728 return _edje_real_part_box_append(rp, child);
2732 edje_object_part_box_prepend(Evas_Object *obj, const char *part, Evas_Object *child)
2737 ed = _edje_fetch(obj);
2738 if ((!ed) || (!part)) return EINA_FALSE;
2740 rp = _edje_real_part_recursive_get(ed, part);
2741 if (!rp) return EINA_FALSE;
2742 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
2744 return _edje_real_part_box_prepend(rp, child);
2748 edje_object_part_box_insert_before(Evas_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference)
2753 ed = _edje_fetch(obj);
2754 if ((!ed) || (!part)) return EINA_FALSE;
2756 rp = _edje_real_part_recursive_get(ed, part);
2757 if (!rp) return EINA_FALSE;
2758 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
2760 return _edje_real_part_box_insert_before(rp, child, reference);
2764 edje_object_part_box_insert_at(Evas_Object *obj, const char *part, Evas_Object *child, unsigned int pos)
2769 ed = _edje_fetch(obj);
2770 if ((!ed) || (!part)) return EINA_FALSE;
2772 rp = _edje_real_part_recursive_get(ed, part);
2773 if (!rp) return EINA_FALSE;
2774 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
2776 return _edje_real_part_box_insert_at(rp, child, pos);
2780 edje_object_part_box_remove(Evas_Object *obj, const char *part, Evas_Object *child)
2785 ed = _edje_fetch(obj);
2786 if ((!ed) || (!part)) return NULL;
2788 rp = _edje_real_part_recursive_get(ed, part);
2789 if (!rp) return NULL;
2790 if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
2792 return _edje_real_part_box_remove(rp, child);
2796 edje_object_part_box_remove_at(Evas_Object *obj, const char *part, unsigned int pos)
2801 ed = _edje_fetch(obj);
2802 if ((!ed) || (!part)) return NULL;
2804 rp = _edje_real_part_recursive_get(ed, part);
2805 if (!rp) return NULL;
2806 if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL;
2808 return _edje_real_part_box_remove_at(rp, pos);
2812 edje_object_part_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool clear)
2817 ed = _edje_fetch(obj);
2818 if ((!ed) || (!part)) return EINA_FALSE;
2820 rp = _edje_real_part_recursive_get(ed, part);
2821 if (!rp) return EINA_FALSE;
2822 if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE;
2824 return _edje_real_part_box_remove_all(rp, clear);
2829 _edje_box_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
2831 Edje_Real_Part *rp = data;
2833 rp->edje->dirty = 1;
2834 #ifdef EDJE_CALC_CACHE
2837 _edje_recalc(rp->edje);
2841 _edje_box_child_add(Edje_Real_Part *rp, Evas_Object *child)
2843 evas_object_event_callback_add
2844 (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
2846 rp->edje->dirty = 1;
2847 #ifdef EDJE_CALC_CACHE
2850 _edje_recalc(rp->edje);
2854 _edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child)
2856 evas_object_event_callback_del_full
2857 (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
2859 rp->edje->dirty = 1;
2860 #ifdef EDJE_CALC_CACHE
2863 _edje_recalc(rp->edje);
2867 _edje_real_part_box_append(Edje_Real_Part *rp, Evas_Object *child_obj)
2869 Evas_Object_Box_Option *opt;
2871 opt = evas_object_box_append(rp->object, child_obj);
2872 if (!opt) return EINA_FALSE;
2874 if (!_edje_box_layout_add_child(rp, child_obj))
2876 evas_object_box_remove(rp->object, child_obj);
2880 _edje_box_child_add(rp, child_obj);
2886 _edje_real_part_box_prepend(Edje_Real_Part *rp, Evas_Object *child_obj)
2888 Evas_Object_Box_Option *opt;
2890 opt = evas_object_box_prepend(rp->object, child_obj);
2891 if (!opt) return EINA_FALSE;
2893 if (!_edje_box_layout_add_child(rp, child_obj))
2895 evas_object_box_remove(rp->object, child_obj);
2899 _edje_box_child_add(rp, child_obj);
2905 _edje_real_part_box_insert_before(Edje_Real_Part *rp, Evas_Object *child_obj, const Evas_Object *ref)
2907 Evas_Object_Box_Option *opt;
2909 opt = evas_object_box_insert_before(rp->object, child_obj, ref);
2910 if (!opt) return EINA_FALSE;
2912 if (!_edje_box_layout_add_child(rp, child_obj))
2914 evas_object_box_remove(rp->object, child_obj);
2918 _edje_box_child_add(rp, child_obj);
2924 _edje_real_part_box_insert_at(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned int pos)
2926 Evas_Object_Box_Option *opt;
2928 opt = evas_object_box_insert_at(rp->object, child_obj, pos);
2929 if (!opt) return EINA_FALSE;
2931 if (!_edje_box_layout_add_child(rp, child_obj))
2933 evas_object_box_remove(rp->object, child_obj);
2937 _edje_box_child_add(rp, child_obj);
2943 _edje_real_part_box_remove(Edje_Real_Part *rp, Evas_Object *child_obj)
2945 if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL;
2946 if (!evas_object_box_remove(rp->object, child_obj)) return NULL;
2947 _edje_box_layout_remove_child(rp, child_obj);
2948 _edje_box_child_remove(rp, child_obj);
2953 _edje_real_part_box_remove_at(Edje_Real_Part *rp, unsigned int pos)
2955 Evas_Object_Box_Option *opt;
2956 Evas_Object_Box_Data *priv;
2957 Evas_Object *child_obj;
2959 priv = evas_object_smart_data_get(rp->object);
2960 opt = eina_list_nth(priv->children, pos);
2961 if (!opt) return NULL;
2962 child_obj = opt->obj;
2963 if (evas_object_data_get(child_obj, "\377 edje.box_item")) return NULL;
2964 if (!evas_object_box_remove_at(rp->object, pos)) return NULL;
2965 _edje_box_layout_remove_child(rp, child_obj);
2966 _edje_box_child_remove(rp, child_obj);
2971 _edje_real_part_box_remove_all(Edje_Real_Part *rp, Eina_Bool clear)
2973 Eina_List *children;
2976 children = evas_object_box_children_get(rp->object);
2979 Evas_Object *child_obj = children->data;
2980 if (evas_object_data_get(child_obj, "\377 edje.box_item"))
2984 _edje_box_layout_remove_child(rp, child_obj);
2985 _edje_box_child_remove(rp, child_obj);
2986 if (!evas_object_box_remove_at(rp->object, i))
2989 evas_object_del(child_obj);
2991 children = eina_list_remove_list(children, children);
2997 _edje_table_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
2999 Edje_Real_Part *rp = data;
3001 rp->edje->dirty = 1;
3002 #ifdef EDJE_CALC_CACHE
3005 _edje_recalc(rp->edje);
3009 _edje_table_child_add(Edje_Real_Part *rp, Evas_Object *child)
3011 evas_object_event_callback_add
3012 (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
3014 rp->edje->dirty = 1;
3015 #ifdef EDJE_CALC_CACHE
3018 _edje_recalc(rp->edje);
3022 _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child)
3024 evas_object_event_callback_del_full
3025 (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
3027 rp->edje->dirty = 1;
3028 #ifdef EDJE_CALC_CACHE
3031 _edje_recalc(rp->edje);
3035 edje_object_part_table_child_get(Evas_Object *obj, const char *part, unsigned int col, unsigned int row)
3040 ed = _edje_fetch(obj);
3041 if ((!ed) || (!part)) return NULL;
3043 rp = _edje_real_part_recursive_get(ed, part);
3044 if (!rp) return NULL;
3045 if (rp->part->type != EDJE_PART_TYPE_TABLE) return NULL;
3047 return evas_object_table_child_get(rp->object, col, row);
3051 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)
3056 ed = _edje_fetch(obj);
3057 if ((!ed) || (!part)) return EINA_FALSE;
3059 rp = _edje_real_part_recursive_get(ed, part);
3060 if (!rp) return EINA_FALSE;
3061 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
3063 return _edje_real_part_table_pack(rp, child_obj, col, row, colspan, rowspan);
3067 edje_object_part_table_unpack(Evas_Object *obj, const char *part, Evas_Object *child_obj)
3072 ed = _edje_fetch(obj);
3073 if ((!ed) || (!part)) return EINA_FALSE;
3075 rp = _edje_real_part_recursive_get(ed, part);
3076 if (!rp) return EINA_FALSE;
3077 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
3079 return _edje_real_part_table_unpack(rp, child_obj);
3083 edje_object_part_table_col_row_size_get(const Evas_Object *obj, const char *part, int *cols, int *rows)
3088 ed = _edje_fetch(obj);
3089 if ((!ed) || (!part)) return EINA_FALSE;
3091 rp = _edje_real_part_recursive_get(ed, part);
3092 if (!rp) return EINA_FALSE;
3093 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
3095 evas_object_table_col_row_size_get(rp->object, cols, rows);
3100 edje_object_part_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear)
3105 ed = _edje_fetch(obj);
3106 if ((!ed) || (!part)) return EINA_FALSE;
3108 rp = _edje_real_part_recursive_get(ed, part);
3109 if (!rp) return EINA_FALSE;
3110 if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE;
3112 _edje_real_part_table_clear(rp, clear);
3117 _edje_perspective_obj_del(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object *obj, __UNUSED__ void *event_info)
3119 Edje_Perspective *ps = data;
3122 EINA_LIST_FREE(ps->users, o)
3126 ed = evas_object_smart_data_get(o);
3130 _edje_recalc_do(ed);
3135 EAPI Edje_Perspective *
3136 edje_perspective_new(Evas *e)
3138 Edje_Perspective *ps;
3139 Evas_Coord vx, vy, vw, vh;
3141 if (!e) return NULL;
3142 ps = calloc(1, sizeof(Edje_Perspective));
3143 ps->obj = evas_object_rectangle_add(e);
3144 evas_object_data_set(ps->obj, "_edje_perspective", ps);
3145 evas_object_event_callback_add(ps->obj, EVAS_CALLBACK_DEL, _edje_perspective_obj_del, ps);
3146 evas_output_viewport_get(e, &vx, &vy, &vw, &vh);
3148 ps->px = vx + (vw / 2);
3149 ps->py = vy + (vh / 2);
3156 edje_perspective_free(Edje_Perspective *ps)
3159 evas_object_del(ps->obj);
3163 edje_perspective_set(Edje_Perspective *ps, Evas_Coord px, Evas_Coord py, Evas_Coord z0, Evas_Coord foc)
3169 if ((ps->px == px) && (ps->py == py) && (ps->z0 == z0) && (ps->foc == foc)) return;
3174 EINA_LIST_FOREACH(ps->users, l, o)
3178 ed = evas_object_smart_data_get(o);
3183 _edje_recalc_do(ed);
3188 EINA_LIST_FOREACH(_edje_edjes, l, o)
3192 ed = evas_object_smart_data_get(o);
3197 _edje_recalc_do(ed);
3204 edje_perspective_global_set(Edje_Perspective *ps, Eina_Bool global)
3210 if (ps->global == global) return;
3213 o = evas_object_name_find(evas_object_evas_get(ps->obj),
3214 "_edje_perspective");
3215 if (o) evas_object_name_set(o, NULL);
3216 evas_object_name_set(ps->obj, "_edje_perspective");
3219 evas_object_name_set(ps->obj, NULL);
3220 ps->global = global;
3221 EINA_LIST_FOREACH(_edje_edjes, l, o)
3225 ed = evas_object_smart_data_get(o);
3230 _edje_recalc_do(ed);
3236 edje_perspective_global_get(const Edje_Perspective *ps)
3238 if (!ps) return EINA_FALSE;
3242 EAPI const Edje_Perspective *
3243 edje_evas_global_perspective_get(const Evas *e)
3247 if (!e) return NULL;
3248 obj = evas_object_name_find(e, "_edje_perspective");
3249 if (!obj) return NULL;
3250 return evas_object_data_get(obj, "_edje_perspective");
3254 edje_object_perspective_set(Evas_Object *obj, Edje_Perspective *ps)
3258 ed = evas_object_smart_data_get(obj);
3260 if (ed->persp == ps) return;
3261 if (ed->persp != ps)
3264 ed->persp->users = eina_list_remove(ed->persp->users, obj);
3267 if (ps) ps->users = eina_list_append(ps->users, obj);
3269 _edje_recalc_do(ed);
3272 EAPI const Edje_Perspective *
3273 edje_object_perspective_get(const Evas_Object *obj)
3277 ed = evas_object_smart_data_get(obj);
3278 if (!ed) return NULL;
3282 #define EDJE_PRELOAD_EMISSION "preload,done"
3283 #define EDJE_PRELOAD_SOURCE NULL
3286 edje_object_preload(Evas_Object *obj, Eina_Bool cancel)
3292 ed = _edje_fetch(obj);
3293 if (!ed) return EINA_FALSE;
3295 _edje_recalc_do(ed);
3297 for (i = 0, count = 0; i < ed->table_parts_size; i++)
3302 rp = ed->table_parts[i];
3305 if (ep->type == EDJE_PART_TYPE_IMAGE ||
3306 (ep->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object))
3310 ed->preload_count = count;
3314 for (i = 0; i < ed->table_parts_size; i++)
3319 rp = ed->table_parts[i];
3322 if (ep->type == EDJE_PART_TYPE_IMAGE)
3324 const char *file = NULL;
3325 const char *key = NULL;
3327 evas_object_event_callback_del_full(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
3329 evas_object_image_file_get(rp->object, &file, &key);
3332 ed->preload_count--;
3336 evas_object_event_callback_add(rp->object, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
3337 evas_object_image_preload(rp->object, cancel);
3341 else if (ep->type == EDJE_PART_TYPE_GROUP)
3343 if (rp->swallowed_object) {
3344 edje_object_signal_callback_del(rp->swallowed_object, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb);
3345 edje_object_signal_callback_add(rp->swallowed_object, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb, ed);
3346 edje_object_preload(rp->swallowed_object, cancel);
3355 _edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
3362 _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)
3365 evas_object_table_pack(rp->object, child_obj, col, row, colspan, rowspan);
3367 _edje_table_child_add(rp, child_obj);
3373 _edje_real_part_table_unpack(Edje_Real_Part *rp, Evas_Object *child_obj)
3375 Eina_Bool ret = evas_object_table_unpack(rp->object, child_obj);
3378 _edje_table_child_remove(rp, child_obj);
3384 _edje_real_part_table_clear(Edje_Real_Part *rp, Eina_Bool clear)
3386 Eina_List *children;
3388 children = evas_object_table_children_get(rp->object);
3391 Evas_Object *child_obj = children->data;
3393 _edje_table_child_remove(rp, child_obj);
3394 if (!evas_object_data_get(child_obj, "\377 edje.table_item"))
3396 evas_object_table_unpack(rp->object, child_obj);
3398 evas_object_del(child_obj);
3400 children = eina_list_remove_list(children, children);
3405 _edje_real_part_recursive_get(const Edje *ed, const char *part)
3410 path = eina_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
3411 if (!path) return NULL;
3413 rp = _edje_real_part_recursive_get_helper(ed, path);
3421 _edje_children_get(Edje_Real_Part *rp, const char *partid)
3428 if (!partid) return NULL;
3430 switch (rp->part->type)
3432 case EDJE_PART_TYPE_EXTERNAL:
3433 return _edje_external_content_get(rp->swallowed_object, partid);
3434 case EDJE_PART_TYPE_BOX:
3435 l = evas_object_box_children_get(rp->object);
3437 case EDJE_PART_TYPE_TABLE:
3438 l = evas_object_table_children_get(rp->object);
3444 v = strtol(partid, &p, 10);
3445 if ((*p == '\0') && (v >= 0))
3447 child = eina_list_nth(l, v);
3453 EINA_LIST_FREE(l, cur)
3455 const char *name = evas_object_name_get(cur);
3456 if ((name) && (!strcmp(name, partid)))
3468 /* rebuild alternative path */
3470 _edje_merge_path(const char *alias, char * const *path)
3473 unsigned int length = 1;
3474 unsigned int alias_length;
3477 if (!alias) return NULL;
3479 alias_length = strlen(alias);
3481 for (i = 0; path[i]; i++)
3482 length += strlen(path[i]) + 1;
3484 tmp = malloc(sizeof (char) * (length + alias_length + 2));
3485 memcpy(tmp, alias, alias_length);
3486 tmp[alias_length] = '\0';
3488 for (i = 0; path[i]; i++)
3490 strcat(tmp, EDJE_PART_PATH_SEPARATOR_STRING);
3491 strcat(tmp, path[i]);
3499 _edje_real_part_recursive_get_helper(const Edje *ed, char **path)
3508 if (ed->collection && ed->collection->alias)
3512 alias = _edje_merge_path(eina_hash_find(ed->collection->alias, path[0]), path + 1);
3514 rp = _edje_real_part_recursive_get(ed, alias);
3520 //printf(" lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
3521 idx = strchr(path[0], EDJE_PART_PATH_SEPARATOR_INDEXL);
3526 end = strchr(idx + 1, EDJE_PART_PATH_SEPARATOR_INDEXR);
3535 rp = _edje_real_part_get(ed, path[0]);
3536 if (!path[1] && !idx) return rp;
3537 if (!rp) return NULL;
3539 switch (rp->part->type)
3541 case EDJE_PART_TYPE_GROUP:
3542 if (!rp->swallowed_object) return NULL;
3543 ed = _edje_fetch(rp->swallowed_object);
3544 if (!ed) return NULL;
3546 return _edje_real_part_recursive_get_helper(ed, path);
3547 case EDJE_PART_TYPE_BOX:
3548 case EDJE_PART_TYPE_TABLE:
3549 case EDJE_PART_TYPE_EXTERNAL:
3550 if (!idx) return rp;
3553 child = _edje_children_get(rp, idx);
3555 ed = _edje_fetch(child);
3557 if (!ed) return NULL;
3558 return _edje_real_part_recursive_get_helper(ed, path);
3564 /* Private Routines */
3566 _edje_real_part_get(const Edje *ed, const char *part)
3570 if (!part) return NULL;
3572 for (i = 0; i < ed->table_parts_size; i++)
3576 rp = ed->table_parts[i];
3577 if ((rp->part->name) && (!strcmp(rp->part->name, part))) return rp;
3583 _edje_color_class_find(Edje *ed, const char *color_class)
3586 Edje_Color_Class *cc = NULL;
3588 if ((!ed) || (!color_class)) return NULL;
3590 /* first look through the object scope */
3591 EINA_LIST_FOREACH(ed->color_classes, l, cc)
3592 if ((cc->name) && (!strcmp(color_class, cc->name))) return cc;
3594 /* next look through the global scope */
3595 cc = eina_hash_find(_edje_color_class_hash, color_class);
3598 /* finally, look through the file scope */
3599 EINA_LIST_FOREACH(ed->file->color_classes, l, cc)
3600 if ((cc->name) && (!strcmp(color_class, cc->name))) return cc;
3606 _edje_color_class_member_add(Edje *ed, const char *color_class)
3610 if ((!ed) || (!color_class)) return;
3611 if (!_edje_color_class_member_hash) _edje_color_class_member_hash = eina_hash_string_superfast_new(NULL);
3612 members = eina_hash_find(_edje_color_class_member_hash, color_class);
3613 if (eina_list_count(members) > 50000)
3614 ERR(EINA_COLOR_RED"E"EINA_COLOR_LIGHTRED"R"EINA_COLOR_ORANGE"R"
3615 EINA_COLOR_YELLOW"R"EINA_COLOR_GREEN"R"EINA_COLOR_CYAN"R"
3616 EINA_COLOR_LIGHTCYAN"R"EINA_COLOR_LIGHTBLUE"R"EINA_COLOR_BLUE"R"
3617 EINA_COLOR_HIGH EINA_COLOR_BLUE"R"EINA_COLOR_RED"R"EINA_COLOR_LIGHTRED"O"
3618 EINA_COLOR_ORANGE"R"EINA_COLOR_YELLOW". "EINA_COLOR_GREEN"C"
3619 EINA_COLOR_CYAN"E"EINA_COLOR_LIGHTCYAN"D"EINA_COLOR_LIGHTBLUE"R"EINA_COLOR_BLUE"I"
3620 EINA_COLOR_RESET"C"EINA_COLOR_RED" B"EINA_COLOR_LIGHTRED"R"EINA_COLOR_ORANGE"O"EINA_COLOR_YELLOW"K"
3621 EINA_COLOR_GREEN"E "EINA_COLOR_CYAN"M"EINA_COLOR_LIGHTCYAN"E"EINA_COLOR_LIGHTBLUE"! "
3622 EINA_COLOR_BLUE"I "EINA_COLOR_HIGH EINA_COLOR_BLUE"N"EINA_COLOR_RED"O"EINA_COLOR_LIGHTRED"W "
3623 EINA_COLOR_ORANGE"L"EINA_COLOR_YELLOW"E"EINA_COLOR_GREEN"A"EINA_COLOR_CYAN"K "EINA_COLOR_LIGHTCYAN"C"
3624 EINA_COLOR_LIGHTBLUE"O"EINA_COLOR_BLUE"L"EINA_COLOR_RESET"O"EINA_COLOR_RED"R"EINA_COLOR_LIGHTRED"C"
3625 EINA_COLOR_ORANGE"L"EINA_COLOR_YELLOW"A"EINA_COLOR_GREEN"S"EINA_COLOR_CYAN"S"EINA_COLOR_LIGHTCYAN"E"
3626 EINA_COLOR_LIGHTBLUE"S");
3628 members = eina_list_prepend(members, ed);
3629 eina_hash_set(_edje_color_class_member_hash, color_class, members);
3633 _edje_color_class_member_del(Edje *ed, const char *color_class)
3637 if ((!ed) || (!color_class)) return;
3638 if (!_edje_color_class_member_hash) return;
3640 members = eina_hash_find(_edje_color_class_member_hash, color_class);
3641 if (!members) return;
3643 members = eina_list_remove(members, ed);
3644 eina_hash_set(_edje_color_class_member_hash, color_class, members);
3648 * Used to free the member lists that are stored in the text_class and
3649 * color_class hashtables.
3652 member_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
3654 eina_list_free(data);
3659 _edje_color_class_members_free(void)
3661 if (!_edje_color_class_member_hash) return;
3662 eina_hash_foreach(_edje_color_class_member_hash, member_list_free, NULL);
3663 eina_hash_free(_edje_color_class_member_hash);
3664 _edje_color_class_member_hash = NULL;
3668 color_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
3670 Edje_Color_Class *cc;
3673 if (cc->name) eina_stringshare_del(cc->name);
3679 _edje_color_class_hash_free(void)
3681 if (!_edje_color_class_hash) return;
3682 eina_hash_foreach(_edje_color_class_hash, color_class_hash_list_free, NULL);
3683 eina_hash_free(_edje_color_class_hash);
3684 _edje_color_class_hash = NULL;
3688 _edje_color_class_on_del(Edje *ed, Edje_Part *ep)
3692 if ((ep->default_desc) && (ep->default_desc->color_class))
3693 _edje_color_class_member_del(ed, ep->default_desc->color_class);
3695 for (i = 0; i < ep->other.desc_count; ++i)
3696 if (ep->other.desc[i]->color_class)
3697 _edje_color_class_member_del(ed, ep->other.desc[i]->color_class);
3701 _edje_text_class_find(Edje *ed, const char *text_class)
3704 Edje_Text_Class *tc;
3706 if ((!ed) || (!text_class)) return NULL;
3707 EINA_LIST_FOREACH(ed->text_classes, l, tc)
3708 if ((tc->name) && (!strcmp(text_class, tc->name))) return tc;
3709 return eina_hash_find(_edje_text_class_hash, text_class);
3713 _edje_text_class_member_direct_del(const char *text_class,
3718 members = eina_hash_find(_edje_text_class_member_hash, text_class);
3719 members = eina_list_remove_list(members, lookup);
3720 eina_hash_set(_edje_text_class_member_hash, text_class, members);
3724 _edje_text_class_member_add(Edje *ed, const char *text_class)
3728 if ((!ed) || (!text_class)) return;
3730 /* Get members list */
3731 members = eina_hash_find(_edje_text_class_member_hash, text_class);
3733 /* Update the member list */
3734 members = eina_list_prepend(members, ed);
3735 if (eina_list_count(members) > 50000)
3736 printf("ERRRRRRRRRROR. CEDRIC BROKE ME! I NOW LEAK TEXTCLASSES\n");
3738 /* Don't loose track of members list */
3740 ed->members = eina_hash_string_small_new(NULL);
3741 eina_hash_set(ed->members, text_class, members);
3743 /* Reset the member list to the right pointer */
3744 if (!_edje_text_class_member_hash)
3745 _edje_text_class_member_hash = eina_hash_string_superfast_new(NULL);
3746 eina_hash_set(_edje_text_class_member_hash, text_class, members);
3750 _edje_text_class_member_del(Edje *ed, const char *text_class)
3755 if ((!ed) || (!text_class)) return;
3756 members = eina_hash_find(_edje_text_class_member_hash, text_class);
3757 if (!members) return;
3759 lookup = eina_hash_find(ed->members, text_class);
3761 if (!lookup) return ;
3763 eina_hash_del(ed->members, text_class, lookup);
3764 members = eina_list_remove_list(members, lookup);
3766 eina_hash_set(_edje_text_class_member_hash, text_class, members);
3770 _edje_text_class_members_free(void)
3772 if (!_edje_text_class_member_hash) return;
3773 eina_hash_foreach(_edje_text_class_member_hash, member_list_free, NULL);
3774 eina_hash_free(_edje_text_class_member_hash);
3775 _edje_text_class_member_hash = NULL;
3779 text_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
3781 Edje_Text_Class *tc;
3784 if (tc->name) eina_stringshare_del(tc->name);
3785 if (tc->font) eina_stringshare_del(tc->font);
3791 _edje_text_class_hash_free(void)
3793 if (!_edje_text_class_hash) return;
3794 eina_hash_foreach(_edje_text_class_hash, text_class_hash_list_free, NULL);
3795 eina_hash_free(_edje_text_class_hash);
3796 _edje_text_class_hash = NULL;
3800 _edje_fetch(const Evas_Object *obj)
3804 if (!evas_object_smart_type_check(obj, "edje"))
3806 ed = evas_object_smart_data_get(obj);
3807 if ((ed) && (ed->delete_me)) return NULL;
3812 _edje_freeze(Edje *ed)
3815 // printf("FREEZE %i\n", ed->freeze);
3820 _edje_thaw(Edje *ed)
3825 // printf("-------------########### OVER THAW\n");
3828 if ((ed->freeze == 0) && (ed->recalc))
3830 // printf("thaw recalc\n");
3837 _edje_block(Edje *ed)
3845 _edje_unblock(Edje *ed)
3849 if (!ed) return ret;
3852 if (ed->block == 0) ed->block_break = 0;
3859 _edje_block_break(Edje *ed)
3861 if (ed->block_break) return 1;
3866 _edje_block_violate(Edje *ed)
3868 if (ed->block > 0) ed->block_break = 1;
3872 _edje_object_part_swallow_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
3874 Evas_Object *edje_obj;
3877 edje_object_part_unswallow(edje_obj, obj);
3882 _edje_real_part_swallow_hints_update(Edje_Real_Part *rp)
3886 type = evas_object_type_get(rp->swallowed_object);
3888 rp->swallow_params.min.w = 0;
3889 rp->swallow_params.min.h = 0;
3890 rp->swallow_params.max.w = -1;
3891 rp->swallow_params.max.h = -1;
3892 if ((type) && (!strcmp(type, "edje")))
3896 edje_object_size_min_get(rp->swallowed_object, &w, &h);
3897 rp->swallow_params.min.w = w;
3898 rp->swallow_params.min.h = h;
3899 edje_object_size_max_get(rp->swallowed_object, &w, &h);
3900 rp->swallow_params.max.w = w;
3901 rp->swallow_params.max.h = h;
3903 else if ((type) && ((!strcmp(type, "text")) || (!strcmp(type, "polygon")) ||
3904 (!strcmp(type, "line"))))
3908 evas_object_geometry_get(rp->swallowed_object, NULL, NULL, &w, &h);
3909 rp->swallow_params.min.w = w;
3910 rp->swallow_params.min.h = h;
3911 rp->swallow_params.max.w = w;
3912 rp->swallow_params.max.h = h;
3915 Evas_Coord w1, h1, w2, h2, aw, ah;
3916 Evas_Aspect_Control am;
3918 evas_object_size_hint_min_get(rp->swallowed_object, &w1, &h1);
3919 evas_object_size_hint_max_get(rp->swallowed_object, &w2, &h2);
3920 evas_object_size_hint_aspect_get(rp->swallowed_object, &am, &aw, &ah);
3921 rp->swallow_params.min.w = w1;
3922 rp->swallow_params.min.h = h1;
3923 if (w2 > 0) rp->swallow_params.max.w = w2;
3924 if (h2 > 0) rp->swallow_params.max.h = h2;
3927 case EVAS_ASPECT_CONTROL_NONE:
3928 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NONE;
3930 case EVAS_ASPECT_CONTROL_NEITHER:
3931 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NEITHER;
3933 case EVAS_ASPECT_CONTROL_HORIZONTAL:
3934 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_HORIZONTAL;
3936 case EVAS_ASPECT_CONTROL_VERTICAL:
3937 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_VERTICAL;
3939 case EVAS_ASPECT_CONTROL_BOTH:
3940 rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_BOTH;
3945 rp->swallow_params.aspect.w = aw;
3946 rp->swallow_params.aspect.h = ah;
3947 evas_object_data_set(rp->swallowed_object, "\377 edje.swallowing_part", rp);
3950 #ifdef EDJE_CALC_CACHE
3956 _edje_object_part_swallow_changed_hints_cb(void *data, __UNUSED__ Evas *e, __UNUSED__ Evas_Object *obj, __UNUSED__ void *event_info)
3961 _edje_real_part_swallow_hints_update(rp);
3962 rp->edje->dirty = 1;
3963 _edje_recalc(rp->edje);
3968 _edje_real_part_swallow(Edje_Real_Part *rp,
3969 Evas_Object *obj_swallow,
3970 Eina_Bool hints_update)
3972 if (rp->swallowed_object)
3974 if (rp->swallowed_object != obj_swallow)
3976 _edje_real_part_swallow_clear(rp);
3977 rp->swallowed_object = NULL;
3982 _edje_real_part_swallow_hints_update(rp);
3983 rp->edje->dirty = 1;
3984 _edje_recalc(rp->edje);
3988 #ifdef EDJE_CALC_CACHE
3991 if (!obj_swallow) return;
3992 rp->swallowed_object = obj_swallow;
3993 evas_object_smart_member_add(rp->swallowed_object, rp->edje->obj);
3995 evas_object_clip_set(rp->swallowed_object, rp->clip_to->object);
3996 else evas_object_clip_set(rp->swallowed_object, rp->edje->base.clipper);
3997 evas_object_stack_above(rp->swallowed_object, rp->object);
3998 evas_object_event_callback_add(rp->swallowed_object,
4000 _edje_object_part_swallow_free_cb,
4002 evas_object_event_callback_add(rp->swallowed_object,
4003 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
4004 _edje_object_part_swallow_changed_hints_cb,
4008 _edje_real_part_swallow_hints_update(rp);
4010 if (rp->part->mouse_events)
4012 _edje_callbacks_add(obj_swallow, rp->edje, rp);
4013 if (rp->part->repeat_events)
4014 evas_object_repeat_events_set(obj_swallow, 1);
4015 if (rp->part->pointer_mode != EVAS_OBJECT_POINTER_MODE_AUTOGRAB)
4016 evas_object_pointer_mode_set(obj_swallow, rp->part->pointer_mode);
4017 evas_object_pass_events_set(obj_swallow, 0);
4020 evas_object_pass_events_set(obj_swallow, 1);
4021 _edje_callbacks_focus_add(rp->swallowed_object, rp->edje, rp);
4023 if (rp->part->precise_is_inside)
4024 evas_object_precise_is_inside_set(obj_swallow, 1);
4026 rp->edje->dirty = 1;
4027 _edje_recalc(rp->edje);
4031 _edje_real_part_swallow_clear(Edje_Real_Part *rp)
4033 evas_object_smart_member_del(rp->swallowed_object);
4034 evas_object_event_callback_del_full(rp->swallowed_object,
4036 _edje_object_part_swallow_free_cb,
4038 evas_object_event_callback_del_full(rp->swallowed_object,
4039 EVAS_CALLBACK_CHANGED_SIZE_HINTS,
4040 _edje_object_part_swallow_changed_hints_cb,
4042 evas_object_clip_unset(rp->swallowed_object);
4043 evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
4044 if (rp->part->mouse_events)
4045 _edje_callbacks_del(rp->swallowed_object, rp->edje);
4046 _edje_callbacks_focus_del(rp->swallowed_object, rp->edje);
4050 _edje_object_preload(Edje *ed)
4052 ed->preload_count--;
4053 if (!ed->preload_count)
4054 _edje_emit(ed, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE);
4058 _edje_object_image_preload_cb(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info)
4062 evas_object_event_callback_del_full(obj, EVAS_CALLBACK_IMAGE_PRELOADED, _edje_object_image_preload_cb, ed);
4063 _edje_object_preload(ed);
4067 _edje_object_signal_preload_cb(void *data, Evas_Object *obj, __UNUSED__ const char *emission, __UNUSED__ const char *source)
4071 edje_object_signal_callback_del(obj, EDJE_PRELOAD_EMISSION, EDJE_PRELOAD_SOURCE, _edje_object_signal_preload_cb);
4072 _edje_object_preload(ed);
4081 _edje_program_remove(Edje_Part_Collection *edc, Edje_Program *p)
4083 Edje_Program ***array;
4084 unsigned int *count;
4087 if (!p->signal && !p->source)
4089 array = &edc->programs.nocmp;
4090 count = &edc->programs.nocmp_count;
4092 else if (p->signal && !strpbrk(p->signal, "*?[\\")
4093 && p->source && !strpbrk(p->source, "*?[\\"))
4095 array = &edc->programs.strcmp;
4096 count = &edc->programs.strcmp_count;
4098 else if (p->signal && edje_program_is_strncmp(p->signal)
4099 && p->source && edje_program_is_strncmp(p->source))
4101 array = &edc->programs.strncmp;
4102 count = &edc->programs.strncmp_count;
4104 else if (p->signal && edje_program_is_strrncmp(p->signal)
4105 && p->source && edje_program_is_strrncmp(p->source))
4107 array = &edc->programs.strrncmp;
4108 count = &edc->programs.strrncmp_count;
4112 array = &edc->programs.fnmatch;
4113 count = &edc->programs.fnmatch_count;
4116 for (i = 0; i < *count; ++i)
4117 if ((*array)[i] == p)
4119 memmove(*array + i, *array + i + 1, sizeof (Edje_Program *) * (*count - i -1));
4131 _edje_program_insert(Edje_Part_Collection *edc, Edje_Program *p)
4133 Edje_Program ***array;
4134 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 *array = realloc(*array, sizeof (Edje_Program *) * (*count + 1));
4166 (*array)[(*count)++] = p;
4170 edje_string_get(const Edje_String *es)
4172 /* FIXME: Handle localization here */
4173 if (!es) return NULL;
4178 edje_string_id_get(const Edje_String *es)
4180 /* FIXME: Handle localization here */
4181 if (!es) return NULL;
4186 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/