diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/Edje.h | 63 | ||||
-rw-r--r-- | src/lib/Makefile.am | 9 | ||||
-rw-r--r-- | src/lib/edje_cache.c | 71 | ||||
-rw-r--r-- | src/lib/edje_calc.c | 198 | ||||
-rw-r--r-- | src/lib/edje_data.c | 29 | ||||
-rw-r--r-- | src/lib/edje_edit.c | 11 | ||||
-rw-r--r-- | src/lib/edje_embryo.c | 12 | ||||
-rw-r--r-- | src/lib/edje_entry.c | 136 | ||||
-rw-r--r-- | src/lib/edje_load.c | 288 | ||||
-rw-r--r-- | src/lib/edje_lua2.c | 68 | ||||
-rw-r--r-- | src/lib/edje_main.c | 30 | ||||
-rw-r--r-- | src/lib/edje_match.c | 24 | ||||
-rw-r--r-- | src/lib/edje_multisense.c | 37 | ||||
-rw-r--r-- | src/lib/edje_private.h | 95 | ||||
-rw-r--r-- | src/lib/edje_program.c | 30 | ||||
-rw-r--r-- | src/lib/edje_smart.c | 1 | ||||
-rw-r--r-- | src/lib/edje_text.c | 8 | ||||
-rw-r--r-- | src/lib/edje_textblock_styles.c | 19 | ||||
-rw-r--r-- | src/lib/edje_util.c | 616 |
19 files changed, 1403 insertions, 342 deletions
diff --git a/src/lib/Edje.h b/src/lib/Edje.h index b477dbc..8cb9041 100644 --- a/src/lib/Edje.h +++ b/src/lib/Edje.h @@ -4,7 +4,7 @@ These routines are used for Edje. @mainpage Edje Library Documentation -@version 1.1 +@version 1.2 @date 2003-2012 Please see the @ref authors page for contact details. @@ -197,7 +197,7 @@ part of Edje's API: @author Davide Andreoli <dave@@gurumeditation.it> @author Sebastian Dransfeld <sd@@tango.flipp.net> @author Tom Hacohen <tom@@stosb.com> -@author Aharon Hillel <a.hillel@@partner.samsung.com> +@author Aharon Hillel <a.hillel@@samsung.com> @author Shilpa Singh <shilpa.singh@samsung.com> <shilpasingh.o@gmail.com> @author Mike Blumenkrantz <michael.blumenkrantz@gmail.com @author Jaehwan Kim <jae.hwan.kim@samsung.com> @@ -305,7 +305,7 @@ extern "C" { #endif #define EDJE_VERSION_MAJOR 1 -#define EDJE_VERSION_MINOR 2 +#define EDJE_VERSION_MINOR 6 typedef struct _Edje_Version { @@ -382,7 +382,8 @@ typedef enum _Edje_Part_Type EDJE_PART_TYPE_TABLE = 9, EDJE_PART_TYPE_EXTERNAL = 10, EDJE_PART_TYPE_PROXY = 11, - EDJE_PART_TYPE_LAST = 12 + EDJE_PART_TYPE_SPACER = 12, /**< @since 1.7 */ + EDJE_PART_TYPE_LAST = 13 } Edje_Part_Type; typedef enum _Edje_Text_Effect @@ -1382,6 +1383,11 @@ EAPI Eina_List *edje_color_class_list (void); * * This function updates all Edje members at the process level which * belong to this text class with the new font attributes. + * If the @p size is 0 then the font size will be kept with the previous size. + * If the @p size is less then 0 then the font size will be calculated in the + * percentage. For example, if the @p size is -50, then the font size will be + * scaled to half of the original size and if the @p size is -10 then the font + * size will be scaled as much as 0.1x. * * @see edje_text_class_get(). * @@ -3168,18 +3174,40 @@ EAPI void *edje_object_text_markup_filter_callback_del(Evas_Object *obj, const c EAPI void *edje_object_text_markup_filter_callback_del_full(Evas_Object *obj, const char *part, Edje_Markup_Filter_Cb func, void *data); /** - * @brief Swallows an object into the edje. + * @brief "Swallows" an object into one of the Edje object @c SWALLOW + * parts. * - * @param obj A valid Evas_Object handle - * @param part The part name - * @param obj_swallow The object to swallow + * @param obj A valid Edje object handle + * @param part The swallow part's name + * @param obj_swallow The object to occupy that part + * + * Swallowing an object into an Edje object is, for a given part of + * type @c SWALLOW in the EDC group which gave life to @a obj, to set + * an external object to be controlled by @a obj, being displayed + * exactly over that part's region inside the whole Edje object's + * viewport. * - * Swallows the object into the edje part so that all geometry changes - * for the part affect the swallowed object. (e.g. resize, move, show, - * raise/lower, etc.). + * From this point on, @a obj will have total control over @a + * obj_swallow's geometry and visibility. For instance, if @a obj is + * visible, as in @c evas_object_show(), the swallowed object will be + * visible too -- if the given @c SWALLOW part it's in is also + * visible. Other actions on @a obj will also reflect on the swallowed + * object as well (e.g. resizing, moving, raising/lowering, etc.). + * + * Finally, all internal changes to @a part, specifically, will + * reflect on the displaying of @a obj_swallow, for example state + * changes leading to different visibility states, geometries, + * positions, etc. * * If an object has already been swallowed into this part, then it - * will first be unswallowed before the new object is swallowed. + * will first be unswallowed (as in edje_object_part_unswallow()) + * before the new object is swallowed. + * + * @note @a obj @b won't delete the swallowed object once it is + * deleted -- @a obj_swallow will get to an unparented state again. + * + * For more details on EDC @c SWALLOW parts, see @ref edcref "syntax + * reference". */ EAPI Eina_Bool edje_object_part_swallow (Evas_Object *obj, const char *part, Evas_Object *obj_swallow); @@ -3646,6 +3674,15 @@ EAPI Evas_Object *edje_object_part_box_remove_at (Evas_Object *obj, con EAPI Eina_Bool edje_object_part_box_remove_all (Evas_Object *obj, const char *part, Eina_Bool clear); /** + * @brief Retrieve a list all accessibility part names + * + * @param obj A valid Evas_Object handle + * @return A list all accessibility part names on @p obj + * @since 1.7.0 + */ +EAPI Eina_List * edje_object_access_part_list_get (const Evas_Object *obj); + +/** * @brief Retrieve a child from a table * * @param obj A valid Evas_Object handle @@ -3654,7 +3691,7 @@ EAPI Eina_Bool edje_object_part_box_remove_all (Evas_Object *obj, con * @param row The row of the child to get * @return The child Evas_Object */ -EAPI Evas_Object *edje_object_part_table_child_get (Evas_Object *obj, const char *part, unsigned int col, unsigned int row); +EAPI Evas_Object *edje_object_part_table_child_get (const Evas_Object *obj, const char *part, unsigned int col, unsigned int row); /** * @brief Packs an object into the table. diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 5a76ef3..6f0edad 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -12,6 +12,7 @@ AM_CPPFLAGS = \ @EVIL_CFLAGS@ \ @EDJE_CFLAGS@ \ @ECORE_IMF_CFLAGS@ \ +@EIO_CFLAGS@ \ @EFL_EDJE_BUILD@ \ @REMIX_CFLAGS@ \ @SNDFILE_CFLAGS@ @@ -114,6 +115,10 @@ edje_amalgamation.c: $(base_sources) Makefile @echo "# include <Ecore_IMF.h>" >> edje_amalgamation.c @echo "#endif" >> edje_amalgamation.c + @echo "#ifdef HAVE_EIO" >> edje_amalgamation.c + @echo "# include <Eio.h>" >> edje_amalgamation.c + @echo "#endif" >> edje_amalgamation.c + @echo "#include <edje_private.h>" >> edje_amalgamation.c @for f in $(base_sources); do \ @@ -123,7 +128,7 @@ edje_amalgamation.c: $(base_sources) Makefile file="$$f" ; \ fi ; \ echo "/* file: $$file */" >> edje_amalgamation.c; \ - grep -v -e '^# *include \+.\(config\|\|Evil\|Eina\|Eet\|Evas\|Ecore\|Embryo\|Ecore_IMF\|string\|math\|limits\|sys/stat\|errno\|time\|unistd\|locale\|lua\|lauxlib\|edje_private\)[.]h.*' $$file >> edje_amalgamation.c; \ + grep -v -e '^# *include \+.\(config\|\|Evil\|Eina\|Eet\|Evas\|Ecore\|Embryo\|Ecore_IMF\|Eio\|string\|math\|limits\|sys/stat\|errno\|time\|unistd\|locale\|lua\|lauxlib\|edje_private\)[.]h.*' $$file >> edje_amalgamation.c; \ done @echo "edje_amalgamation.c generated" @@ -131,7 +136,7 @@ else libedje_la_SOURCES = $(base_sources) endif -libedje_la_LIBADD = @EDJE_LIBS@ @ECORE_IMF_LIBS@ @EVIL_LIBS@ @REMIX_LIBS@ @SNDFILE_LIBS@ -lm +libedje_la_LIBADD = @EDJE_LIBS@ @ECORE_IMF_LIBS@ @EIO_LIBS@ @EVIL_LIBS@ @REMIX_LIBS@ @SNDFILE_LIBS@ -lm libedje_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ EXTRA_DIST = edje_private.h edje_container.h edje_convert.h diff --git a/src/lib/edje_cache.c b/src/lib/edje_cache.c index 477e6ec..77095e6 100644 --- a/src/lib/edje_cache.c +++ b/src/lib/edje_cache.c @@ -63,6 +63,7 @@ _edje_file_coll_open(Edje_File *edf, const char *coll) INIT_EMP_BOTH(BOX, Edje_Part_Description_Box, ce); INIT_EMP_BOTH(TABLE, Edje_Part_Description_Table, ce); INIT_EMP_BOTH(EXTERNAL, Edje_Part_Description_External, ce); + INIT_EMP_BOTH(SPACER, Edje_Part_Description_Common, ce); INIT_EMP(part, Edje_Part, ce); snprintf(buf, sizeof(buf), "edje/collections/%i", id); @@ -127,12 +128,57 @@ _edje_file_coll_open(Edje_File *edf, const char *coll) return edc; } +#ifdef HAVE_EIO +static Eina_Bool +_edje_file_warn(void *data) +{ + Edje_File *edf = data; + Eina_List *l, *ll; + Edje *ed; + + edf->references++; + + EINA_LIST_FOREACH(edf->edjes, l, ed) + _edje_ref(ed); + + EINA_LIST_FOREACH(edf->edjes, l, ed) + { + _edje_emit(ed, "edje,change,file", "edje"); + } + + EINA_LIST_FOREACH_SAFE(edf->edjes, l, ll, ed) + _edje_unref(ed); + + edf->references--; + + edf->timeout = NULL; + return EINA_FALSE; +} + +static Eina_Bool +_edje_file_change(void *data, int ev_type __UNUSED__, void *event) +{ + Edje_File *edf = data; + Eio_Monitor_Event *ev = event; + + if (ev->monitor == edf->monitor) + { + if (edf->timeout) ecore_timer_del(edf->timeout); + edf->timeout = ecore_timer_add(0.5, _edje_file_warn, edf); + } + return ECORE_CALLBACK_PASS_ON; +} +#endif + static Edje_File * _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret, time_t mtime) { Edje_File *edf; Edje_Part_Collection *edc; Eet_File *ef; +#ifdef HAVE_EIO + Ecore_Event_Handler *ev; +#endif ef = eet_open(file, EET_FILE_MODE_READ); if (!ef) @@ -150,6 +196,17 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co edf->ef = ef; edf->mtime = mtime; +#ifdef HAVE_EIO + edf->monitor = eio_monitor_add(file); + ev = ecore_event_handler_add(EIO_MONITOR_FILE_DELETED, _edje_file_change, edf); + edf->handlers = eina_list_append(edf->handlers, ev); + ev = ecore_event_handler_add(EIO_MONITOR_FILE_MODIFIED, _edje_file_change, edf); + edf->handlers = eina_list_append(edf->handlers, ev); + ev = ecore_event_handler_add(EIO_MONITOR_FILE_CREATED, _edje_file_change, edf); + edf->handlers = eina_list_append(edf->handlers, ev); + ev = ecore_event_handler_add(EIO_MONITOR_SELF_DELETED, _edje_file_change, edf); + edf->handlers = eina_list_append(edf->handlers, ev); +#endif if (edf->version != EDJE_FILE_VERSION) { @@ -203,7 +260,7 @@ _edje_file_dangling(Edje_File *edf) } Edje_File * -_edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret) +_edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret, Edje *ed) { Edje_File *edf; Eina_List *l, *hist; @@ -259,6 +316,12 @@ open_new: if (!edf) return NULL; +#ifdef HAVE_EIO + if (ed) edf->edjes = eina_list_append(edf->edjes, ed); +#else + (void) ed; +#endif + eina_hash_add(_edje_file_hash, file, edf); return edf; @@ -364,6 +427,12 @@ open: edc->checked = 1; } } +#ifdef HAVE_EIO + if (edc && ed) edf->edjes = eina_list_append(edf->edjes, ed); +#else + (void) ed; +#endif + if (edc_ret) *edc_ret = edc; return edf; diff --git a/src/lib/edje_calc.c b/src/lib/edje_calc.c index 5d2ed08..8d57e52 100644 --- a/src/lib/edje_calc.c +++ b/src/lib/edje_calc.c @@ -232,6 +232,12 @@ _edje_get_description_by_orientation(Edje *ed, Edje_Part_Description_Common *src ce->count.GROUP++; memsize = sizeof(Edje_Part_Description_Common); break; + case EDJE_PART_TYPE_SPACER: + desc_rtl = eina_mempool_malloc(ce->mp_rtl.SPACER, + sizeof (Edje_Part_Description_Common)); + ce->count.SPACER++; + memsize = sizeof(Edje_Part_Description_Common); + break; EDIT_ALLOC_POOL_RTL(TEXT, Text, text); EDIT_ALLOC_POOL_RTL(TEXTBLOCK, Text, text); EDIT_ALLOC_POOL_RTL(IMAGE, Image, image); @@ -241,7 +247,7 @@ _edje_get_description_by_orientation(Edje *ed, Edje_Part_Description_Common *src EDIT_ALLOC_POOL_RTL(EXTERNAL, External, external_params); } - if(desc_rtl) + if (desc_rtl) memcpy(desc_rtl, src, memsize); _edje_part_make_rtl(desc_rtl); @@ -402,7 +408,7 @@ _edje_real_part_image_set(Edje *ed, Edje_Real_Part *ep, FLOAT_T pos) FROM_DOUBLE(0.5)))); if (image_num > (image_count - 1)) image_num = image_count - 1; - if (image_num == 0) + if (image_num <= 0) { image_id = _edje_image_find(ep->object, ed, &ep->param1.set, @@ -414,10 +420,10 @@ _edje_real_part_image_set(Edje *ed, Edje_Real_Part *ep, FLOAT_T pos) { if (image_num == (image_count - 1)) { - image_id = _edje_image_find(ep->object, ed, - &ep->param2->set, - (Edje_Part_Description_Image*) ep->param2->description, - NULL); + image_id = _edje_image_find(ep->object, ed, + &ep->param2->set, + (Edje_Part_Description_Image*) ep->param2->description, + NULL); } else { @@ -429,11 +435,13 @@ _edje_real_part_image_set(Edje *ed, Edje_Real_Part *ep, FLOAT_T pos) } if (image_id < 0) { - ERR("¨Part \"%s\" has description, " - "\"%s\" %3.3f with a missing image id!!!", + ERR("¨Part \"%s\" description, " + "\"%s\" %3.3f with image %i index has a missing image id in a set of %i !!!", ep->part->name, ep->param1.description->state.name, - ep->param1.description->state.value); + ep->param1.description->state.value, + image_num, + image_count); } else { @@ -661,6 +669,77 @@ _edje_recalc_do(Edje *ed) edje_object_size_min_calc(ed->obj, &w, &h); evas_object_size_hint_min_set(ed->obj, w, h); } + + if (!ed->collection) return ; + + for (i = 0; i < ed->collection->limits.parts_count; i++) + { + const char *name; + unsigned char limit; + int part; + + part = ed->collection->limits.parts[i].part; + name = ed->collection->parts[part]->name; + limit = ed->table_parts[part]->chosen_description->limit; + switch (limit) + { + case 0: + ed->collection->limits.parts[i].width = EDJE_PART_LIMIT_UNKNOWN; + ed->collection->limits.parts[i].height = EDJE_PART_LIMIT_UNKNOWN; + break; + case 1: + ed->collection->limits.parts[i].height = EDJE_PART_LIMIT_UNKNOWN; + break; + case 2: + ed->collection->limits.parts[i].width = EDJE_PART_LIMIT_UNKNOWN; + break; + case 3: + break; + } + + if ((limit & 1) == 1) + { + if (ed->table_parts[part]->w > 0 && + (ed->collection->limits.parts[i].width != EDJE_PART_LIMIT_OVER)) + { + ed->collection->limits.parts[i].width = EDJE_PART_LIMIT_OVER; + _edje_emit(ed, "limit,width,over", name); + } + else if (ed->table_parts[part]->w < 0 && + ed->collection->limits.parts[i].width != EDJE_PART_LIMIT_BELOW) + { + ed->collection->limits.parts[i].width = EDJE_PART_LIMIT_BELOW; + _edje_emit(ed, "limit,width,below", name); + } + else if (ed->table_parts[part]->w == 0 && + ed->collection->limits.parts[i].width != EDJE_PART_LIMIT_ZERO) + { + ed->collection->limits.parts[i].width = EDJE_PART_LIMIT_ZERO; + _edje_emit(ed, "limit,width,zero", name); + } + } + if ((limit & 2) == 2) + { + if (ed->table_parts[part]->h > 0 && + (ed->collection->limits.parts[i].height != EDJE_PART_LIMIT_OVER)) + { + ed->collection->limits.parts[i].height = EDJE_PART_LIMIT_OVER; + _edje_emit(ed, "limit,height,over", name); + } + else if (ed->table_parts[part]->h < 0 && + ed->collection->limits.parts[i].height != EDJE_PART_LIMIT_BELOW) + { + ed->collection->limits.parts[i].height = EDJE_PART_LIMIT_BELOW; + _edje_emit(ed, "limit,height,below", name); + } + else if (ed->table_parts[part]->h == 0 && + ed->collection->limits.parts[i].height != EDJE_PART_LIMIT_ZERO) + { + ed->collection->limits.parts[i].height = EDJE_PART_LIMIT_ZERO; + _edje_emit(ed, "limit,height,zero", name); + } + } + } } void @@ -1173,7 +1252,33 @@ _edje_part_recalc_single_textblock(FLOAT_T sc, if (*maxh < *minh) *maxh = *minh; } } - evas_object_textblock_valign_set(ep->object, chosen_desc->text.align.y); + if ((chosen_desc->text.fit_x) || (chosen_desc->text.fit_y)) + { + double s = 1.0; + + if (ep->part->scale) s = TO_DOUBLE(sc); + evas_object_scale_set(ep->object, s); + evas_object_textblock_size_formatted_get(ep->object, &tw, &th); + if (chosen_desc->text.fit_x) + { + if ((tw > 0) && (tw > params->w)) + { + s = (s * params->w) / (double)tw; + evas_object_scale_set(ep->object, s); + evas_object_textblock_size_formatted_get(ep->object, &tw, &th); + } + } + if (chosen_desc->text.fit_y) + { + if ((th > 0) && (th > params->h)) + { + s = (s * params->h) / (double)th; + evas_object_scale_set(ep->object, s); + evas_object_textblock_size_formatted_get(ep->object, &tw, &th); + } + } + } + evas_object_textblock_valign_set(ep->object, TO_DOUBLE(chosen_desc->text.align.y)); } } @@ -2015,23 +2120,26 @@ _edje_part_recalc_single(Edje *ed, else if (ep->part->type == EDJE_PART_TYPE_PROXY) _edje_part_recalc_single_fill(ep, &((Edje_Part_Description_Proxy *)desc)->proxy.fill, params); - /* colors */ - if ((desc->color_class) && (*desc->color_class)) - cc = _edje_color_class_find(ed, desc->color_class); - - if (cc) + if (ep->part->type != EDJE_PART_TYPE_SPACER) { - params->color.r = (((int)cc->r + 1) * desc->color.r) >> 8; - params->color.g = (((int)cc->g + 1) * desc->color.g) >> 8; - params->color.b = (((int)cc->b + 1) * desc->color.b) >> 8; - params->color.a = (((int)cc->a + 1) * desc->color.a) >> 8; - } - else - { - params->color.r = desc->color.r; - params->color.g = desc->color.g; - params->color.b = desc->color.b; - params->color.a = desc->color.a; + /* colors */ + if ((desc->color_class) && (*desc->color_class)) + cc = _edje_color_class_find(ed, desc->color_class); + + if (cc) + { + params->color.r = (((int)cc->r + 1) * desc->color.r) >> 8; + params->color.g = (((int)cc->g + 1) * desc->color.g) >> 8; + params->color.b = (((int)cc->b + 1) * desc->color.b) >> 8; + params->color.a = (((int)cc->a + 1) * desc->color.a) >> 8; + } + else + { + params->color.r = desc->color.r; + params->color.g = desc->color.g; + params->color.b = desc->color.b; + params->color.a = desc->color.a; + } } /* visible */ @@ -2049,6 +2157,8 @@ _edje_part_recalc_single(Edje *ed, params->type.common.spec.image.t = img_desc->image.border.t; params->type.common.spec.image.b = img_desc->image.border.b; + + params->type.common.spec.image.border_scale_by = img_desc->image.border.scale_by; break; } case EDJE_PART_TYPE_TEXT: @@ -2087,6 +2197,7 @@ _edje_part_recalc_single(Edje *ed, break; } + case EDJE_PART_TYPE_SPACER: case EDJE_PART_TYPE_RECTANGLE: case EDJE_PART_TYPE_BOX: case EDJE_PART_TYPE_TABLE: @@ -2158,6 +2269,9 @@ _edje_proxy_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj case EDJE_PART_TYPE_EXTERNAL: evas_object_image_source_set(ep->object, pp->swallowed_object); break; + case EDJE_PART_TYPE_SPACER: + /* FIXME: detect that at compile time and prevent it */ + break; } evas_object_image_fill_set(ep->object, p3->type.common.fill.x, p3->type.common.fill.y, @@ -2177,9 +2291,9 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj evas_object_image_smooth_scale_set(ep->object, p3->smooth); if (chosen_desc->image.border.scale) { - if (chosen_desc->image.border.scale_by > FROM_DOUBLE(0.0)) + if (p3->type.common.spec.image.border_scale_by > FROM_DOUBLE(0.0)) { - FLOAT_T sc2 = MUL(sc, chosen_desc->image.border.scale_by); + FLOAT_T sc2 = MUL(sc, p3->type.common.spec.image.border_scale_by); evas_object_image_border_scale_set(ep->object, TO_DOUBLE(sc2)); } else @@ -2187,9 +2301,9 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj } else { - if (chosen_desc->image.border.scale_by > FROM_DOUBLE(0.0)) + if (p3->type.common.spec.image.border_scale_by > FROM_DOUBLE(0.0)) evas_object_image_border_scale_set - (ep->object, TO_DOUBLE(chosen_desc->image.border.scale_by)); + (ep->object, TO_DOUBLE(p3->type.common.spec.image.border_scale_by)); else evas_object_image_border_scale_set(ep->object, 1.0); } @@ -2410,6 +2524,8 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta return; } + pos = ep->description_pos; + if (ep->part->type == EDJE_PART_TYPE_PROXY) { Edje_Real_Part *pp; @@ -2534,10 +2650,9 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta #endif } - pos = ep->description_pos; - pos2 = pos; - if (pos2 < ZERO) pos2 = ZERO; - else if (pos2 > FROM_INT(1)) pos2 = FROM_INT(1); + pos2 = pos; + if (pos2 < ZERO) pos2 = ZERO; + else if (pos2 > FROM_INT(1)) pos2 = FROM_INT(1); beginning_pos = (pos < FROM_DOUBLE(0.5)); part_type = ep->part->type; @@ -2598,6 +2713,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta p3->type.common.spec.image.r = INTP(p1->type.common.spec.image.r, p2->type.common.spec.image.r, pos); p3->type.common.spec.image.t = INTP(p1->type.common.spec.image.t, p2->type.common.spec.image.t, pos); p3->type.common.spec.image.b = INTP(p1->type.common.spec.image.b, p2->type.common.spec.image.b, pos); + p3->type.common.spec.image.border_scale_by = INTP(p1->type.common.spec.image.border_scale_by, p2->type.common.spec.image.border_scale_by, pos); case EDJE_PART_TYPE_PROXY: p3->type.common.fill.x = INTP(p1->type.common.fill.x, p2->type.common.fill.x, pos); p3->type.common.fill.y = INTP(p1->type.common.fill.y, p2->type.common.fill.y, pos); @@ -2784,6 +2900,9 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta /* FIXME: definitivly remove this code when we switch to new format. */ abort(); break; + case EDJE_PART_TYPE_SPACER: + /* We really should do nothing on SPACER part */ + break; } /* Some object need special recalc. */ @@ -2815,6 +2934,9 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta /* FIXME: definitivly remove this code when we switch to new format. */ abort(); break; + case EDJE_PART_TYPE_SPACER: + /* We really should do nothing on SPACER part */ + break; } if (ep->swallowed_object) @@ -2838,13 +2960,13 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta mo = ep->swallowed_object; } else mo = ep->object; - if (chosen_desc->map.on) + if (chosen_desc->map.on && ep->part->type != EDJE_PART_TYPE_SPACER) { - Evas_Map *map; + static Evas_Map *map = NULL; ed->have_mapped_part = 1; // create map and populate with part geometry - map = evas_map_new(4); + if (!map) map = evas_map_new(4); evas_map_util_points_populate_from_object(map, ep->object); if (ep->part->type == EDJE_PART_TYPE_IMAGE) { @@ -2898,7 +3020,6 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta evas_object_map_set(mo, map); evas_object_map_enable_set(mo, 1); - evas_map_free(map); } else { @@ -2922,5 +3043,4 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta ep->invalidate = 0; } #endif - } diff --git a/src/lib/edje_data.c b/src/lib/edje_data.c index 46fd521..da30329 100644 --- a/src/lib/edje_data.c +++ b/src/lib/edje_data.c @@ -30,6 +30,7 @@ Eet_Data_Descriptor *_edje_edd_edje_part = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_pointer = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_description_variant = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_description_rectangle = NULL; +Eet_Data_Descriptor *_edje_edd_edje_part_description_spacer = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_description_swallow = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_description_group = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_description_image = NULL; @@ -41,6 +42,7 @@ Eet_Data_Descriptor *_edje_edd_edje_part_description_table = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_description_external = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_description_variant_list = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_description_rectangle_pointer = NULL; +Eet_Data_Descriptor *_edje_edd_edje_part_description_spacer_pointer = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_description_swallow_pointer = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_description_group_pointer = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_description_image_pointer = NULL; @@ -53,6 +55,7 @@ Eet_Data_Descriptor *_edje_edd_edje_part_description_external_pointer = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_image_id = NULL; Eet_Data_Descriptor *_edje_edd_edje_part_image_id_pointer = NULL; Eet_Data_Descriptor *_edje_edd_edje_external_param = NULL; +Eet_Data_Descriptor *_edje_edd_edje_part_limit = NULL; #define EMP(Type, Minus) \ Eina_Mempool *_emp_##Type = NULL; \ @@ -83,6 +86,7 @@ EMP(GROUP, group); EMP(BOX, box); EMP(TABLE, table); EMP(EXTERNAL, external); +EMP(SPACER, spacer); EMP(part, part); #define FREED(eed) \ @@ -105,7 +109,8 @@ struct { { EDJE_PART_TYPE_BOX, "box" }, { EDJE_PART_TYPE_TABLE, "table" }, { EDJE_PART_TYPE_EXTERNAL, "external" }, - { EDJE_PART_TYPE_PROXY, "proxy" } + { EDJE_PART_TYPE_PROXY, "proxy" }, + { EDJE_PART_TYPE_SPACER, "spacer" } }; static const char * @@ -187,6 +192,7 @@ _edje_edd_shutdown(void) FREED(_edje_edd_edje_part_pointer); FREED(_edje_edd_edje_part_description_variant); FREED(_edje_edd_edje_part_description_rectangle); + FREED(_edje_edd_edje_part_description_spacer); FREED(_edje_edd_edje_part_description_swallow); FREED(_edje_edd_edje_part_description_group); FREED(_edje_edd_edje_part_description_image); @@ -198,6 +204,7 @@ _edje_edd_shutdown(void) FREED(_edje_edd_edje_part_description_external); FREED(_edje_edd_edje_part_description_variant_list); FREED(_edje_edd_edje_part_description_rectangle_pointer); + FREED(_edje_edd_edje_part_description_spacer_pointer); FREED(_edje_edd_edje_part_description_swallow_pointer); FREED(_edje_edd_edje_part_description_group_pointer); FREED(_edje_edd_edje_part_description_image_pointer); @@ -212,6 +219,7 @@ _edje_edd_shutdown(void) FREED(_edje_edd_edje_external_param); FREED(_edje_edd_edje_image_directory_set); FREED(_edje_edd_edje_image_directory_set_entry); + FREED(_edje_edd_edje_part_limit); } #define EDJE_DEFINE_POINTER_TYPE(Type, Name) \ @@ -329,6 +337,7 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection_directory_entry, Edje_Part_Collection_Directory_Entry, "count.BOX", count.BOX, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection_directory_entry, Edje_Part_Collection_Directory_Entry, "count.TABLE", count.TABLE, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection_directory_entry, Edje_Part_Collection_Directory_Entry, "count.EXTERNAL", count.EXTERNAL, EET_T_INT); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection_directory_entry, Edje_Part_Collection_Directory_Entry, "count.SPACER", count.SPACER, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection_directory_entry, Edje_Part_Collection_Directory_Entry, "count.part", count.part, EET_T_INT); EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Style_Tag); @@ -447,6 +456,7 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "state.name", state.name, EET_T_STRING); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "state.value", state.value, EET_T_DOUBLE); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "visible", visible, EET_T_CHAR); \ + EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "limit", limit, EET_T_CHAR); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "align.x", align.x, EDJE_T_FLOAT); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "align.y", align.y, EDJE_T_FLOAT); \ EET_DATA_DESCRIPTOR_ADD_BASIC(Edd, Type, "fixed.w", fixed.w, EET_T_UCHAR); \ @@ -563,6 +573,13 @@ _edje_edd_init(void) EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON(_edje_edd_edje_part_description_rectangle, Edje_Part_Description_Common); EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description_Common); + eddc.func.mem_free = mem_free_spacer; + eddc.func.mem_alloc = mem_alloc_spacer; + _edje_edd_edje_part_description_spacer = + eet_data_descriptor_file_new(&eddc); + EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON(_edje_edd_edje_part_description_spacer, Edje_Part_Description_Common); + + EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description_Common); eddc.func.mem_free = mem_free_swallow; eddc.func.mem_alloc = mem_alloc_swallow; _edje_edd_edje_part_description_swallow = @@ -726,6 +743,7 @@ _edje_edd_init(void) EDJE_DATA_DESCRIPTOR_DESCRIPTION_COMMON_SUB(_edje_edd_edje_part_description_external, Edje_Part_Description_External, common); EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_description_external, Edje_Part_Description_External, "external_params", external_params, _edje_edd_edje_external_param); + EDJE_DEFINE_POINTER_TYPE(Part_Description_Common, part_description_spacer); EDJE_DEFINE_POINTER_TYPE(Part_Description_Common, part_description_rectangle); EDJE_DEFINE_POINTER_TYPE(Part_Description_Common, part_description_swallow); EDJE_DEFINE_POINTER_TYPE(Part_Description_Common, part_description_group); @@ -742,6 +760,7 @@ _edje_edd_init(void) eddc.func.type_set = _edje_description_variant_type_set; _edje_edd_edje_part_description_variant = eet_data_descriptor_file_new(&eddc); + EET_DATA_DESCRIPTOR_ADD_MAPPING(_edje_edd_edje_part_description_variant, "spacer", _edje_edd_edje_part_description_spacer); EET_DATA_DESCRIPTOR_ADD_MAPPING(_edje_edd_edje_part_description_variant, "rectangle", _edje_edd_edje_part_description_rectangle); EET_DATA_DESCRIPTOR_ADD_MAPPING(_edje_edd_edje_part_description_variant, "swallow", _edje_edd_edje_part_description_swallow); EET_DATA_DESCRIPTOR_ADD_MAPPING(_edje_edd_edje_part_description_variant, "group", _edje_edd_edje_part_description_group); @@ -767,6 +786,7 @@ _edje_edd_init(void) _edje_edd_edje_part_description_variant_list = eet_data_descriptor_file_new(&eddc); EDJE_ADD_ARRAY_MAPPING(_edje_edd_edje_part_description_variant_list, "rectangle", rectangle); + EDJE_ADD_ARRAY_MAPPING(_edje_edd_edje_part_description_variant_list, "spacer", spacer); EDJE_ADD_ARRAY_MAPPING(_edje_edd_edje_part_description_variant_list, "swallow", swallow); EDJE_ADD_ARRAY_MAPPING(_edje_edd_edje_part_description_variant_list, "group", group); EDJE_ADD_ARRAY_MAPPING(_edje_edd_edje_part_description_variant_list, "image", image); @@ -846,9 +866,15 @@ _edje_edd_init(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "select_mode", select_mode, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "cursor_mode", cursor_mode, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "multiline", multiline, EET_T_UCHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "access", access, EET_T_UCHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "api.name", api.name, EET_T_STRING); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "api.description", api.description, EET_T_STRING); + EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Limit); + _edje_edd_edje_part_limit = eet_data_descriptor_file_new(&eddc); + + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_limit, Edje_Part_Limit, "part", part, EET_T_INT); + EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Collection); _edje_edd_edje_part_collection = eet_data_descriptor_file_new(&eddc); @@ -866,6 +892,7 @@ _edje_edd_init(void) EDJE_DEFINE_POINTER_TYPE(Limit, limit); EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(_edje_edd_edje_part_collection, Edje_Part_Collection, "limits.vertical", limits.vertical, _edje_edd_edje_limit_pointer); EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(_edje_edd_edje_part_collection, Edje_Part_Collection, "limits.horizontal", limits.horizontal, _edje_edd_edje_limit_pointer); + EET_DATA_DESCRIPTOR_ADD_VAR_ARRAY(_edje_edd_edje_part_collection, Edje_Part_Collection, "limits.parts", limits.parts, _edje_edd_edje_part_limit); EET_DATA_DESCRIPTOR_ADD_HASH(_edje_edd_edje_part_collection, Edje_Part_Collection, "data", data, _edje_edd_edje_string); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "id", id, EET_T_INT); diff --git a/src/lib/edje_edit.c b/src/lib/edje_edit.c index eec5e04..3991542 100644 --- a/src/lib/edje_edit.c +++ b/src/lib/edje_edit.c @@ -1021,7 +1021,7 @@ edje_edit_group_add(Evas_Object *obj, const char *name) //cd = _alloc(sizeof(Code)); //codes = eina_list_append(codes, cd); #define EDIT_EMN(Tp, Sz, Ce) \ - Ce->mp.Tp = eina_mempool_add("chained_mempool", #Tp, NULL, sizeof (Sz), 10); + Ce->mp.Tp = eina_mempool_add("chained_mempool", #Tp, NULL, sizeof (Sz), 8); EDIT_EMN(RECTANGLE, Edje_Part_Description_Common, de); EDIT_EMN(TEXT, Edje_Part_Description_Text, de); @@ -1032,6 +1032,7 @@ edje_edit_group_add(Evas_Object *obj, const char *name) EDIT_EMN(BOX, Edje_Part_Description_Box, de); EDIT_EMN(TABLE, Edje_Part_Description_Table, de); EDIT_EMN(EXTERNAL, Edje_Part_Description_External, de); + EDIT_EMN(SPACER, Edje_Part_Description_Common, de); EDIT_EMN(part, Edje_Part, de); ed->file->collection_cache = eina_list_prepend(ed->file->collection_cache, pc); @@ -2118,7 +2119,7 @@ _edje_edit_real_part_add(Evas_Object *obj, const char *name, Edje_Part_Type type } else if (ep->type == EDJE_PART_TYPE_TEXTBLOCK) rp->object = evas_object_textblock_add(ed->base.evas); - else + else if (ep->type != EDJE_PART_TYPE_SPACER) ERR("wrong part type %i!", ep->type); if (rp->object) { @@ -2969,6 +2970,10 @@ _edje_edit_state_alloc(int type, Edje *ed) pd = eina_mempool_malloc(ce->mp.RECTANGLE, sizeof (Edje_Part_Description_Common)); ce->count.RECTANGLE++; break; + case EDJE_PART_TYPE_SPACER: + pd = eina_mempool_malloc(ce->mp.SPACER, sizeof (Edje_Part_Description_Common)); + ce->count.SPACER++; + break; case EDJE_PART_TYPE_SWALLOW: pd = eina_mempool_malloc(ce->mp.SWALLOW, sizeof (Edje_Part_Description_Common)); ce->count.SWALLOW++; @@ -6572,7 +6577,7 @@ edje_edit_script_error_list_get(Evas_Object *obj) #define BUF_APPENDF(FMT, ...) \ ret &= eina_strbuf_append_printf(buf, FMT, ##__VA_ARGS__) -static const char *types[] = {"NONE", "RECT", "TEXT", "IMAGE", "SWALLOW", "TEXTBLOCK", "GRADIENT", "GROUP", "BOX", "TABLE", "EXTERNAL"}; +static const char *types[] = {"NONE", "RECT", "TEXT", "IMAGE", "SWALLOW", "TEXTBLOCK", "GRADIENT", "GROUP", "BOX", "TABLE", "EXTERNAL", "SPACER"}; static const char *effects[] = {"NONE", "PLAIN", "OUTLINE", "SOFT_OUTLINE", "SHADOW", "SOFT_SHADOW", "OUTLINE_SHADOW", "OUTLINE_SOFT_SHADOW ", "FAR_SHADOW ", "FAR_SOFT_SHADOW", "GLOW"}; static const char *prefers[] = {"NONE", "VERTICAL", "HORIZONTAL", "BOTH"}; diff --git a/src/lib/edje_embryo.c b/src/lib/edje_embryo.c index 1ad2377..ffcbc64 100644 --- a/src/lib/edje_embryo.c +++ b/src/lib/edje_embryo.c @@ -871,14 +871,20 @@ _edje_embryo_fn_set_state(Embryo_Program *ep, Embryo_Cell *params) double value = 0.0; Edje_Real_Part *rp; - CHKPARAM(3); + if (!(HASNPARAMS(2) || HASNPARAMS(3))) return -1; + ed = embryo_program_data_get(ep); GETSTR(state, params[2]); if ((!state)) return 0; part_id = params[1]; if (part_id < 0) return 0; - f = EMBRYO_CELL_TO_FLOAT(params[3]); - value = (double)f; + if (HASNPARAMS(3)) + { + f = EMBRYO_CELL_TO_FLOAT(params[3]); + value = (double)f; + } + else + value = 0.0; rp = ed->table_parts[part_id % ed->table_parts_size]; if (rp) { diff --git a/src/lib/edje_entry.c b/src/lib/edje_entry.c index 09109f6..0e074b9 100644 --- a/src/lib/edje_entry.c +++ b/src/lib/edje_entry.c @@ -1319,10 +1319,15 @@ _range_del_emit(Edje *ed, Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o __ { size_t start, end; char *tmp; - Edje_Entry_Change_Info *info = calloc(1, sizeof(*info)); - info->insert = EINA_FALSE; + Edje_Entry_Change_Info *info; + start = evas_textblock_cursor_pos_get(en->sel_start); end = evas_textblock_cursor_pos_get(en->sel_end); + if (start == end) + goto noop; + + info = calloc(1, sizeof(*info)); + info->insert = EINA_FALSE; info->change.del.start = start; info->change.del.end = end; @@ -1333,6 +1338,7 @@ _range_del_emit(Edje *ed, Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o __ _edje_emit(ed, "entry,changed", en->rp->part->name); _edje_emit_full(ed, "entry,changed,user", en->rp->part->name, info, _free_entry_change_info); +noop: _sel_clear(en->cursor, en->rp->object, en); } @@ -1525,7 +1531,7 @@ _edje_key_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, v if (shift) _sel_start(en->cursor, rp->object, en); else _sel_clear(en->cursor, rp->object, en); } - /* If control is pressed, go to the start of the word */ + /* If control is pressed, go to the end of the word */ if (control) evas_textblock_cursor_word_end(en->cursor); evas_textblock_cursor_char_next(en->cursor); if (en->select_allow) @@ -1547,7 +1553,7 @@ _edje_key_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, v evas_textblock_cursor_char_prev(en->cursor); evas_textblock_cursor_word_start(en->cursor); - _sel_extend(en->cursor, rp->object, en); + _sel_preextend(en->cursor, rp->object, en); _range_del_emit(ed, en->cursor, rp->object, en); } @@ -2035,8 +2041,9 @@ _edje_part_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS Entry *en; Evas_Coord x, y, w, h; // Eina_Bool multiline; - Evas_Textblock_Cursor *tc; + Evas_Textblock_Cursor *tc = NULL; Eina_Bool dosel = EINA_FALSE; + Eina_Bool shift; if (!rp) return; if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return; en = rp->entry_data; @@ -2063,8 +2070,7 @@ _edje_part_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS } #endif - _edje_entry_imf_context_reset(rp); - + shift = evas_key_modifier_is_set(ev->modifiers, "Shift"); en->select_mod_start = EINA_FALSE; en->select_mod_end = EINA_FALSE; if (rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_DEFAULT) @@ -2077,33 +2083,63 @@ _edje_part_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS if (ev->button == 2) dosel = EINA_FALSE; if (dosel) { + evas_object_geometry_get(rp->object, &x, &y, &w, &h); + cx = ev->canvas.x - x; + cy = ev->canvas.y - y; if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK) { - en->have_selection = EINA_FALSE; - en->selecting = EINA_FALSE; - _sel_clear(en->cursor, rp->object, en); - tc = evas_object_textblock_cursor_new(rp->object); - evas_textblock_cursor_copy(en->cursor, tc); - evas_textblock_cursor_line_char_first(en->cursor); - _sel_start(en->cursor, rp->object, en); - evas_textblock_cursor_line_char_last(en->cursor); - _sel_extend(en->cursor, rp->object, en); - + if (shift) + { + tc = evas_object_textblock_cursor_new(rp->object); + evas_textblock_cursor_copy(en->cursor, tc); + if (evas_textblock_cursor_compare(en->cursor, en->sel_start) < 0) + evas_textblock_cursor_line_char_first(en->cursor); + else + evas_textblock_cursor_line_char_last(en->cursor); + _sel_extend(en->cursor, rp->object, en); + } + else + { + en->have_selection = EINA_FALSE; + en->selecting = EINA_FALSE; + _sel_clear(en->cursor, rp->object, en); + tc = evas_object_textblock_cursor_new(rp->object); + evas_textblock_cursor_copy(en->cursor, tc); + evas_textblock_cursor_line_char_first(en->cursor); + _sel_start(en->cursor, rp->object, en); + evas_textblock_cursor_line_char_last(en->cursor); + _sel_extend(en->cursor, rp->object, en); + } goto end; } else if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) { - en->have_selection = EINA_FALSE; - en->selecting = EINA_FALSE; - _sel_clear(en->cursor, rp->object, en); - tc = evas_object_textblock_cursor_new(rp->object); - evas_textblock_cursor_copy(en->cursor, tc); - evas_textblock_cursor_word_start(en->cursor); - _sel_start(en->cursor, rp->object, en); - evas_textblock_cursor_word_end(en->cursor); - evas_textblock_cursor_char_next(en->cursor); - _sel_extend(en->cursor, rp->object, en); - + if (shift) + { + tc = evas_object_textblock_cursor_new(rp->object); + evas_textblock_cursor_copy(en->cursor, tc); + if (evas_textblock_cursor_compare(en->cursor, en->sel_start) < 0) + evas_textblock_cursor_word_start(en->cursor); + else + { + evas_textblock_cursor_word_end(en->cursor); + evas_textblock_cursor_char_next(en->cursor); + } + _sel_extend(en->cursor, rp->object, en); + } + else + { + en->have_selection = EINA_FALSE; + en->selecting = EINA_FALSE; + _sel_clear(en->cursor, rp->object, en); + tc = evas_object_textblock_cursor_new(rp->object); + evas_textblock_cursor_copy(en->cursor, tc); + evas_textblock_cursor_word_start(en->cursor); + _sel_start(en->cursor, rp->object, en); + evas_textblock_cursor_word_end(en->cursor); + evas_textblock_cursor_char_next(en->cursor); + _sel_extend(en->cursor, rp->object, en); + } goto end; } } @@ -2154,8 +2190,16 @@ _edje_part_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS _curs_lin_end(en->cursor, rp->object, en); } } - if ((en->have_selection) && - (rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_EXPLICIT)) + } + } + if (dosel) + { + if ((en->have_selection) && + (rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_EXPLICIT)) + { + if (shift) + _sel_extend(en->cursor, rp->object, en); + else { Eina_List *first, *last; FLOAT_T sc; @@ -2166,7 +2210,7 @@ _edje_part_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS { Evas_Textblock_Rectangle *r1, *r2; Evas_Coord d, d1, d2; - + r1 = first->data; r2 = last->data; d = r1->x - cx; @@ -2199,6 +2243,11 @@ _edje_part_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUS } } } + } + else + { + if ((en->have_selection) && (shift)) + _sel_extend(en->cursor, rp->object, en); else { en->selecting = EINA_TRUE; @@ -3293,6 +3342,7 @@ _edje_entry_user_insert(Edje_Real_Part *rp, const char *text) } info->change.insert.pos = evas_textblock_cursor_pos_get(en->cursor); _text_filter_markup_prepend(en, en->cursor, text); + _anchors_get(en->cursor, rp->object, en); _edje_emit(rp->edje, "entry,changed", rp->part->name); _edje_emit_full(rp->edje, "entry,changed,user", rp->part->name, info, _free_entry_change_info); @@ -3467,8 +3517,13 @@ _edje_entry_input_panel_language_get(Edje_Real_Part *rp) return en->input_panel_lang; } +#ifdef HAVE_ECORE_IMF void _edje_entry_input_panel_imdata_set(Edje_Real_Part *rp, const void *data, int len) +#else +void +_edje_entry_input_panel_imdata_set(Edje_Real_Part *rp, const void *data __UNUSED__, int len __UNUSED__) +#endif { Entry *en = rp->entry_data; if (!en) return; @@ -3478,8 +3533,13 @@ _edje_entry_input_panel_imdata_set(Edje_Real_Part *rp, const void *data, int len #endif } +#ifdef HAVE_ECORE_IMF void _edje_entry_input_panel_imdata_get(Edje_Real_Part *rp, void *data, int *len) +#else +void +_edje_entry_input_panel_imdata_get(Edje_Real_Part *rp, void *data __UNUSED__, int *len __UNUSED__) +#endif { Entry *en = rp->entry_data; if (!en) return; @@ -3489,8 +3549,13 @@ _edje_entry_input_panel_imdata_get(Edje_Real_Part *rp, void *data, int *len) #endif } +#ifdef HAVE_ECORE_IMF void _edje_entry_input_panel_return_key_type_set(Edje_Real_Part *rp, Edje_Input_Panel_Return_Key_Type return_key_type) +#else +void +_edje_entry_input_panel_return_key_type_set(Edje_Real_Part *rp, Edje_Input_Panel_Return_Key_Type return_key_type __UNUSED__) +#endif { Entry *en = rp->entry_data; if (!en) return; @@ -3512,8 +3577,13 @@ _edje_entry_input_panel_return_key_type_get(Edje_Real_Part *rp) return EDJE_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT; } +#ifdef HAVE_ECORE_IMF void _edje_entry_input_panel_return_key_disabled_set(Edje_Real_Part *rp, Eina_Bool disabled) +#else +void +_edje_entry_input_panel_return_key_disabled_set(Edje_Real_Part *rp, Eina_Bool disabled __UNUSED__) +#endif { Entry *en = rp->entry_data; if (!en) return; @@ -4143,6 +4213,10 @@ _edje_entry_imf_event_preedit_changed_cb(void *data, Ecore_IMF_Context *ctx __UN } } } + else + { + eina_strbuf_append(buf, preedit_string); + } if ((rp->part->entry_mode == EDJE_ENTRY_EDIT_MODE_PASSWORD) && _edje_password_show_last) { diff --git a/src/lib/edje_load.c b/src/lib/edje_load.c index fc2aea3..e6efc96 100644 --- a/src/lib/edje_load.c +++ b/src/lib/edje_load.c @@ -1,12 +1,38 @@ #include "edje_private.h" +typedef struct _Edje_Table_Items Edje_Table_Items; +struct _Edje_Table_Items +{ + Evas_Object *child; + const char *part; + unsigned short col; + unsigned short row; + unsigned short colspan; + unsigned short rowspan; +}; + +typedef struct _Edje_Drag_Items Edje_Drag_Items; +struct _Edje_Drag_Items +{ + const char *part; + FLOAT_T x, y, w, h; + struct { + FLOAT_T x, y; + } step; + struct { + FLOAT_T x, y; + } page; +}; + #ifdef EDJE_PROGRAM_CACHE static Eina_Bool _edje_collection_free_prog_cache_matches_free_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata); #endif static void _edje_object_pack_item_hints_set(Evas_Object *obj, Edje_Pack_Element *it); static void _cb_signal_repeat(void *data, Evas_Object *obj, const char *signal, const char *source); -static Eina_List *_edje_swallows_collect(Edje *ed); +static Eina_List *_edje_object_collect(Edje *ed); + +static int _sort_defined_boxes(const void *a, const void *b); /************************** API Routines **************************/ @@ -89,7 +115,7 @@ edje_file_collection_list(const char *file) int error_ret = 0; if ((!file) || (!*file)) return NULL; - edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL); + edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL, NULL); if (edf) { Eina_Iterator *i; @@ -129,7 +155,7 @@ edje_file_group_exists(const char *file, const char *glob) if ((!file) || (!*file) || (!glob)) return EINA_FALSE; - edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL); + edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL, NULL); if (!edf) return EINA_FALSE; @@ -189,7 +215,7 @@ edje_file_data_get(const char *file, const char *key) if (key) { - edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL); + edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL, NULL); if (edf) { str = (char*) edje_string_get(eina_hash_find(edf->data, key)); @@ -280,7 +306,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g Eina_List *textblocks = NULL; Eina_List *sources = NULL; Eina_List *externals = NULL; - Eina_List *old_swallows; + Eina_List *collect = NULL; unsigned int n; Eina_List *parts = NULL; int group_path_started = 0; @@ -290,15 +316,25 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g if (!file) file = ""; if (!group) group = ""; if (((ed->path) && (!strcmp(file, ed->path))) && - (ed->group) && (!strcmp(group, ed->group))) - return 1; + (ed->group) && (!strcmp(group, ed->group)) && + ed->file) + { + struct stat st; + + if (stat(file, &st) != 0) + return 1; + if (st.st_mtime == ed->file->mtime) + return 1; + } tev = evas_object_evas_get(obj); evas_event_freeze(tev); - old_swallows = _edje_swallows_collect(ed); + + collect = _edje_object_collect(ed); if (_edje_script_only(ed)) _edje_script_only_shutdown(ed); if (_edje_lua_script_only(ed)) _edje_lua_script_only_shutdown(ed); + _edje_file_del(ed); eina_stringshare_replace(&ed->path, file); @@ -407,7 +443,8 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g _edje_part_description_find(ed, rp, "default", 0.0); rp->chosen_description = rp->param1.description; if (!rp->param1.description) - ERR("no default part description!"); + ERR("no default part description for '%s'!", + rp->part->name); switch (ep->type) { @@ -451,6 +488,10 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g case EDJE_PART_TYPE_GRADIENT: ERR("SPANK ! SPANK ! SPANK ! YOU ARE USING GRADIENT IN PART %s FROM GROUP %s INSIDE FILE %s !! THEY ARE NOW REMOVED !", ep->name, group, file); + break; + case EDJE_PART_TYPE_SPACER: + rp->object = NULL; + break; default: ERR("wrong part type %i!", ep->type); break; @@ -515,7 +556,9 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g if (rp->part->clip_to_id >= 0) { rp->clip_to = ed->table_parts[rp->part->clip_to_id % ed->table_parts_size]; - if (rp->clip_to) + if (rp->clip_to && + rp->clip_to->object && + rp->object) { evas_object_pass_events_set(rp->clip_to->object, 1); evas_object_pointer_mode_set(rp->clip_to->object, EVAS_OBJECT_POINTER_MODE_NOGRAB); @@ -817,23 +860,71 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g } /* reswallow any swallows that existed before setting the file */ - if (old_swallows) - { - while (old_swallows) - { - const char *name; - Evas_Object *swallow; + if (collect) + { + Edje_User_Defined *eud; + Eina_List *boxes = NULL; - name = eina_list_data_get(old_swallows); - old_swallows = eina_list_remove_list(old_swallows, old_swallows); + EINA_LIST_FREE(collect, eud) + { + Evas_Object *child = NULL; + + switch (eud->type) + { + case EDJE_USER_SWALLOW: + edje_object_part_swallow(obj, eud->part, eud->u.swallow.child); + child = eud->u.swallow.child; + break; + case EDJE_USER_BOX_PACK: + boxes = eina_list_append(boxes, eud); + eud = NULL; + break; + case EDJE_USER_TABLE_PACK: + edje_object_part_table_pack(obj, eud->part, eud->u.table.child, + eud->u.table.col, eud->u.table.row, + eud->u.table.colspan, eud->u.table.rowspan); + child = eud->u.table.child; + break; + case EDJE_USER_DRAG_STEP: + edje_object_part_drag_step_set(obj, eud->part, + eud->u.drag_position.x, + eud->u.drag_position.y); + break; + case EDJE_USER_DRAG_PAGE: + edje_object_part_drag_page_set(obj, eud->part, + eud->u.drag_position.x, + eud->u.drag_position.y); + break; + case EDJE_USER_DRAG_VALUE: + edje_object_part_drag_value_set(obj, eud->part, + eud->u.drag_position.x, + eud->u.drag_position.y); + break; + case EDJE_USER_DRAG_SIZE: + edje_object_part_drag_size_set(obj, eud->part, + eud->u.drag_size.w, + eud->u.drag_size.h); + break; + case EDJE_USER_STRING: + edje_object_part_text_set(obj, eud->part, eud->u.string.text); + eina_stringshare_del(eud->u.string.text); + break; + } + if (eud) _edje_user_definition_remove(eud, child); + } - swallow = eina_list_data_get(old_swallows); - old_swallows = eina_list_remove_list(old_swallows, old_swallows); + boxes = eina_list_sort(boxes, -1, _sort_defined_boxes); + EINA_LIST_FREE(boxes, eud) + { + edje_object_part_box_append(obj, eud->part, eud->u.box.child); + _edje_user_definition_remove(eud, eud->u.box.child); + } + } - edje_object_part_swallow(obj, name, swallow); - eina_stringshare_del(name); - } - } + if (edje_object_mirrored_get(obj)) + edje_object_signal_emit(obj, "edje,state,rtl", "edje"); + else + edje_object_signal_emit(obj, "edje,state,ltr", "edje"); _edje_recalc(ed); _edje_thaw(ed); @@ -893,7 +984,8 @@ _edje_file_add(Edje *ed) if (!_edje_edd_edje_file) return; ed->file = _edje_cache_file_coll_open(ed->path, ed->group, &(ed->load_error), - &(ed->collection)); + &(ed->collection), + ed); if (!ed->collection) { @@ -905,31 +997,98 @@ _edje_file_add(Edje *ed) } } +static int +_sort_defined_boxes(const void *a, const void *b) +{ + const Edje_User_Defined *euda = a; + const Edje_User_Defined *eudb = b; + + if (euda->part - eudb->part != 0) + return euda->part - eudb->part; + return euda->u.box.index - eudb->u.box.index; +} + static Eina_List * -_edje_swallows_collect(Edje *ed) +_edje_object_collect(Edje *ed) { - Eina_List *swallows = NULL; - unsigned int i; + Edje_User_Defined *eud; + Eina_List *collect; + Eina_List *l; - if (!ed->file || !ed->table_parts) return NULL; - for (i = 0; i < ed->table_parts_size; i++) - { - Edje_Real_Part *rp; + collect = ed->user_defined; + ed->user_defined = NULL; - rp = ed->table_parts[i]; - if (rp->part->type != EDJE_PART_TYPE_SWALLOW || !rp->swallowed_object) continue; - swallows = eina_list_append(swallows, eina_stringshare_add(rp->part->name)); - swallows = eina_list_append(swallows, rp->swallowed_object); + EINA_LIST_FOREACH(collect, l, eud) + { + switch (eud->type) + { + case EDJE_USER_STRING: + eud->u.string.text = eina_stringshare_ref(eud->u.string.text); + break; + case EDJE_USER_BOX_PACK: + if (eud->u.box.index == -1) + { + Edje_User_Defined *search; + Edje_Real_Part *rp; + Eina_List *children; + Eina_List *ls; + Evas_Object *child; + int idx = 0; + + rp = _edje_real_part_recursive_get(ed, eud->part); + if (rp->part->type != EDJE_PART_TYPE_BOX) continue ; + + children = evas_object_box_children_get(rp->object); + EINA_LIST_FREE(children, child) + if (!evas_object_data_get(child, "\377 edje.box_item")) + { + EINA_LIST_FOREACH(l, ls, search) + { + if (search->type == EDJE_USER_BOX_PACK && + search->u.box.child == child && + search->part == eud->part /* beauty of stringshare ! */) + { + search->u.box.index = idx++; + break; + } + } + _edje_real_part_box_remove(rp, child); + } + } + break; + case EDJE_USER_TABLE_PACK: + { + Edje_Real_Part *rp; + + rp = _edje_real_part_recursive_get(ed, eud->part); + if (rp->part->type != EDJE_PART_TYPE_TABLE) continue ; + + _edje_real_part_table_unpack(rp, eud->u.table.child); + break; + } + case EDJE_USER_SWALLOW: + edje_object_part_unswallow(NULL, eud->u.swallow.child); + break; + case EDJE_USER_DRAG_STEP: + case EDJE_USER_DRAG_PAGE: + case EDJE_USER_DRAG_VALUE: + case EDJE_USER_DRAG_SIZE: + break; + } } - return swallows; + + return collect; } void _edje_file_del(Edje *ed) { - Evas *tev = evas_object_evas_get(ed->obj); + Edje_User_Defined *eud; + Evas *tev = NULL; - evas_event_freeze(tev); + if (ed->obj) tev = evas_object_evas_get(ed->obj); + + if (tev) evas_event_freeze(tev); if (ed->freeze_calc) { _edje_freeze_calc_list = eina_list_remove(_edje_freeze_calc_list, ed); @@ -948,10 +1107,20 @@ _edje_file_del(Edje *ed) if (!((ed->file) && (ed->collection))) { - evas_event_thaw(tev); - evas_event_thaw_eval(tev); + if (tev) + { + evas_event_thaw(tev); + evas_event_thaw_eval(tev); + } return; } + + while (ed->user_defined) + { + eud = eina_list_data_get(ed->user_defined); + _edje_user_definition_free(eud); + } + if (ed->table_parts) { unsigned int i; @@ -970,7 +1139,6 @@ _edje_file_del(Edje *ed) } if (rp->swallowed_object) { - _edje_real_part_swallow_clear(rp); /* Objects swallowed by the app do not get deleted, but those internally swallowed (GROUP type) do. */ switch (rp->part->type) @@ -984,6 +1152,7 @@ _edje_file_del(Edje *ed) default: break; } + _edje_real_part_swallow_clear(rp); rp->swallowed_object = NULL; } if (rp->items) @@ -1046,7 +1215,10 @@ _edje_file_del(Edje *ed) } if (ed->file) { - _edje_cache_file_unref(ed->file); +#ifdef HAVE_EIO + ed->file->edjes = eina_list_remove(ed->file->edjes, ed); +#endif + _edje_cache_file_unref(ed->file); ed->file = NULL; } if (ed->actions) @@ -1070,8 +1242,9 @@ _edje_file_del(Edje *ed) free(pp); } } + if (ed->L) _edje_lua2_script_shutdown(ed); - while (ed->subobjs) evas_object_del(ed->subobjs->data); + while (ed->subobjs) _edje_subobj_unregister(ed, ed->subobjs->data); if (ed->table_parts) free(ed->table_parts); ed->table_parts = NULL; ed->table_parts_size = 0; @@ -1079,14 +1252,20 @@ _edje_file_del(Edje *ed) ed->table_programs = NULL; ed->table_programs_size = 0; ed->focused_part = NULL; - evas_event_thaw(tev); - evas_event_thaw_eval(tev); + if (tev) + { + evas_event_thaw(tev); + evas_event_thaw_eval(tev); + } } void _edje_file_free(Edje_File *edf) { Edje_Color_Class *ecc; +#ifdef HAVE_EIO + Ecore_Event_Handler *event; +#endif #define HASH_FREE(Hash) \ if (Hash) eina_hash_free(Hash); \ @@ -1156,6 +1335,12 @@ _edje_file_free(Edje_File *edf) } if (edf->collection_patterns) edje_match_patterns_free(edf->collection_patterns); +#ifdef HAVE_EIO + if (edf->timeout) ecore_timer_del(edf->timeout); + EINA_LIST_FREE(edf->handlers, event) + ecore_event_handler_del(event); + eio_monitor_del(edf->monitor); +#endif if (edf->path) eina_stringshare_del(edf->path); if (edf->free_strings && edf->compiler) eina_stringshare_del(edf->compiler); _edje_textblock_style_cleanup(edf); @@ -1272,6 +1457,7 @@ _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec, Edje_Part_Collec eina_mempool_del(ce->mp.BOX); eina_mempool_del(ce->mp.TABLE); eina_mempool_del(ce->mp.EXTERNAL); + eina_mempool_del(ce->mp.SPACER); eina_mempool_del(ce->mp.part); memset(&ce->mp, 0, sizeof (ce->mp)); @@ -1285,6 +1471,7 @@ _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec, Edje_Part_Collec eina_mempool_del(ce->mp_rtl.BOX); eina_mempool_del(ce->mp_rtl.TABLE); eina_mempool_del(ce->mp_rtl.EXTERNAL); + eina_mempool_del(ce->mp_rtl.SPACER); memset(&ce->mp_rtl, 0, sizeof (ce->mp_rtl)); free(ec); ce->ref = NULL; @@ -1403,8 +1590,8 @@ _edje_object_pack_item_hints_set(Evas_Object *obj, Edje_Pack_Element *it) evas_object_size_hint_request_set(obj, it->prefer.w, it->prefer.h); evas_object_size_hint_max_set(obj, it->max.w, it->max.h); evas_object_size_hint_padding_set(obj, it->padding.l, it->padding.r, it->padding.t, it->padding.b); - evas_object_size_hint_align_set(obj, it->align.x, it->align.y); - evas_object_size_hint_weight_set(obj, it->weight.x, it->weight.y); + evas_object_size_hint_align_set(obj, TO_DOUBLE(it->align.x), TO_DOUBLE(it->align.y)); + evas_object_size_hint_weight_set(obj, TO_DOUBLE(it->weight.x), TO_DOUBLE(it->weight.y)); evas_object_size_hint_aspect_set(obj, it->aspect.mode, it->aspect.w, it->aspect.h); evas_object_resize(obj, w, h); @@ -1544,6 +1731,7 @@ _cb_signal_repeat(void *data, Evas_Object *obj, const char *sig, const char *sou emsg.sig = sig; emsg.src = alias ? alias : new_src; emsg.data = NULL; - _edje_message_send(ed_parent, EDJE_QUEUE_SCRIPT, - EDJE_MESSAGE_SIGNAL, 0, &emsg); + if (ed_parent) + _edje_message_send(ed_parent, EDJE_QUEUE_SCRIPT, + EDJE_MESSAGE_SIGNAL, 0, &emsg); } diff --git a/src/lib/edje_lua2.c b/src/lib/edje_lua2.c index fd88f31..32fb2e1 100644 --- a/src/lib/edje_lua2.c +++ b/src/lib/edje_lua2.c @@ -180,7 +180,7 @@ static const char *_elua_ecore_timer_meta = "ecore_timer_meta"; static int _elua_obj_gc(lua_State *L); -static const struct luaL_reg _elua_edje_gc_funcs [] = +static const struct luaL_Reg _elua_edje_gc_funcs [] = { {"__gc", _elua_obj_gc}, // garbage collector func for edje objects @@ -635,7 +635,7 @@ static int _elua_text(lua_State *L); //static int _elua_textblock(lua_State *L); /* XXX: disabled until there are enough textblock functions implemented to make it actually useful static const char *_elua_edje_api = "edje"; -static const struct luaL_reg _elua_edje_funcs [] = +static const struct luaL_Reg _elua_edje_funcs [] = { // add an echo too to make it more shelly {"echo", _elua_echo}, // test func - echo (i know we have print. test) @@ -1712,10 +1712,9 @@ static int _elua_color(lua_State *L); static int _elua_obj_map(lua_State *L); static int _elua_obj_map_enable(lua_State *L); -static int _elua_obj_map_source(lua_State *L); static const char *_elua_evas_api = "evas"; -static const struct luaL_reg _elua_evas_funcs [] = +static const struct luaL_Reg _elua_evas_funcs [] = { {"del", _elua_obj_del}, // generic del any object created for edje (evas objects, timers, animators, transitions... everything) @@ -1759,7 +1758,6 @@ static const struct luaL_reg _elua_evas_funcs [] = // map api here {"map", _elua_obj_map}, {"map_enable", _elua_obj_map_enable}, - {"map_source", _elua_obj_map_source}, {NULL, NULL} // end }; @@ -2492,48 +2490,6 @@ _elua_obj_map_enable(lua_State *L) // Stack usage [ return 1; } -/** -@page luaref -@subsubsection evas_map_source evas_object:map_source(object) - -Sets the object as the map source for this object. - -Wraps evas_object_map_source_set(). - -@param object The map source object. - -@return A userdata reference to the current map source object. - -@since 1.1.0 -*/ -static int -_elua_obj_map_source(lua_State *L) // Stack usage [-3, +4, -] -{ - Edje_Lua_Obj *obj = (Edje_Lua_Obj *)lua_touserdata(L, 1); // Stack usage [-0, +0, -] - Edje_Lua_Evas_Object *elo = (Edje_Lua_Evas_Object *)obj; - Evas_Object *o; - Edje_Lua_Evas_Object *elo2; - int n; - - if (!_elua_isa(obj, _elua_evas_meta)) return 0; - - n = lua_gettop(L); // Stack usage [-0, +0, -] - if (n == 2) - { - Edje_Lua_Obj *obj2 = (Edje_Lua_Obj *)lua_touserdata(L, 2); // Stack usage [-0, +0, -] - const Edje_Lua_Evas_Object *source = (Edje_Lua_Evas_Object *)obj2; - - if (!_elua_isa(obj2, _elua_evas_meta)) return 0; - evas_object_map_source_set(elo->evas_obj, source->evas_obj); - } - - if (!(o = evas_object_map_source_get(elo->evas_obj))) return 0; - if (!(elo2 = evas_object_data_get(o, ELO))) return 0; - _elua_ref_get(L, elo2); // Stack usage [-3, +4, -] - - return 1; -} - //------------- //------------- /** @@ -2548,7 +2504,7 @@ In the following, "animator_object" is a place holder for any lua variable that holds a reference to an ecore animator object. */ static const char *_elua_ecore_animator_api = "ecore_animator"; -static const struct luaL_reg _elua_ecore_animator_funcs [] = +static const struct luaL_Reg _elua_ecore_animator_funcs [] = { {NULL, NULL} // end }; @@ -2568,7 +2524,7 @@ holds a reference to an ecore timer object. */ static const char *_elua_ecore_timer_api = "ecore_timer"; -static const struct luaL_reg _elua_ecore_timer_funcs [] = +static const struct luaL_Reg _elua_ecore_timer_funcs [] = { {NULL, NULL} // end }; @@ -2594,7 +2550,7 @@ static int _elua_edje_file(lua_State *L); static const char *_elua_evas_edje_api = "evas_edje"; static const char *_elua_evas_edje_parent = "evas_edje_parent"; -static const struct luaL_reg _elua_evas_edje_funcs [] = +static const struct luaL_Reg _elua_evas_edje_funcs [] = { {"file", _elua_edje_file}, // get or set edje file and group @@ -2693,7 +2649,7 @@ static int _elua_image_image(lua_State *L); static const char *_elua_evas_image_api = "evas_image"; static const char *_elua_evas_image_parent = "evas_image_parent"; -static const struct luaL_reg _elua_evas_image_funcs [] = +static const struct luaL_Reg _elua_evas_image_funcs [] = { {"fill", _elua_image_fill}, // get or set the fill parameters {"filled", _elua_image_filled}, // get or set the filled state (overrides fill()) @@ -2895,7 +2851,7 @@ static int _elua_line_xy(lua_State *L); static const char *_elua_evas_line_api = "evas_line"; static const char *_elua_evas_line_parent = "evas_line_parent"; -static const struct luaL_reg _elua_evas_line_funcs [] = +static const struct luaL_Reg _elua_evas_line_funcs [] = { {"xy", _elua_line_xy}, // get or set line coords @@ -2977,7 +2933,7 @@ static int _elua_map_uv(lua_State *L); static int _elua_map_zoom(lua_State *L); static const char *_elua_evas_map_api = "ewas_map"; -static const struct luaL_reg _elua_evas_map_funcs [] = +static const struct luaL_Reg _elua_evas_map_funcs [] = { {"alpha", _elua_map_alpha}, // {"dup", _elua_map_dup}, // not sure of proper api for this. @@ -3540,7 +3496,7 @@ static int _elua_polygon_point(lua_State *L); static const char *_elua_evas_polygon_api = "evas_polygon"; static const char *_elua_evas_polygon_parent = "evas_polygon_parent"; -static const struct luaL_reg _elua_evas_polygon_funcs [] = +static const struct luaL_Reg _elua_evas_polygon_funcs [] = { {"clear", _elua_polygon_clear}, // clear all polygon points {"point", _elua_polygon_point}, // add a polygon point @@ -3620,7 +3576,7 @@ static int _elua_text_text(lua_State *L); static const char *_elua_evas_text_api = "evas_text"; static const char *_elua_evas_text_parent = "evas_text_parent"; -static const struct luaL_reg _elua_evas_text_funcs [] = +static const struct luaL_Reg _elua_evas_text_funcs [] = { {"font", _elua_text_font}, // get or set text font {"text", _elua_text_text}, // get or set text @@ -3747,7 +3703,7 @@ _elua_text_text(lua_State *L) // Stack usage [ static int _elua_bogan_nilfunc(lua_State *L); static int _elua_bogan_index(lua_State *L); -static const struct luaL_reg _elua_bogan_funcs [] = +static const struct luaL_Reg _elua_bogan_funcs [] = { {"nilfunc", _elua_bogan_nilfunc}, // Just return a nil. {"__index", _elua_bogan_index}, // Return the above func. diff --git a/src/lib/edje_main.c b/src/lib/edje_main.c index c01e6d3..833d1ee 100644 --- a/src/lib/edje_main.c +++ b/src/lib/edje_main.c @@ -51,6 +51,14 @@ edje_init(void) goto shutdown_embryo; } +#ifdef HAVE_EIO + if (!eio_init()) + { + ERR("Eio init failed"); + goto shutdown_eet; + } +#endif + _edje_scale = FROM_DOUBLE(1.0); _edje_edd_init(); @@ -66,25 +74,25 @@ edje_init(void) _edje_real_part_mp = eina_mempool_add("chained_mempool", "Edje_Real_Part", NULL, - sizeof (Edje_Real_Part), 128); + sizeof (Edje_Real_Part), 32); if (!_edje_real_part_mp) { ERR("Mempool for Edje_Real_Part cannot be allocated."); - goto shutdown_eet; + goto shutdown_all; } _edje_real_part_state_mp = eina_mempool_add("chained_mempool", "Edje_Real_Part_State", NULL, - sizeof (Edje_Real_Part_State), 256); + sizeof (Edje_Real_Part_State), 32); if (!_edje_real_part_state_mp) { ERR("Mempool for Edje_Real_Part_State cannot be allocated."); - goto shutdown_eet; + goto shutdown_all; } return _edje_init_count; - shutdown_eet: + shutdown_all: eina_mempool_del(_edje_real_part_state_mp); eina_mempool_del(_edje_real_part_mp); _edje_real_part_state_mp = NULL; @@ -96,6 +104,10 @@ edje_init(void) _edje_text_class_members_free(); _edje_text_class_hash_free(); _edje_edd_shutdown(); +#ifdef HAVE_EIO + eio_shutdown(); + shutdown_eet: +#endif eet_shutdown(); shutdown_embryo: embryo_shutdown(); @@ -134,6 +146,9 @@ _edje_shutdown_core(void) _edje_text_class_hash_free(); _edje_edd_shutdown(); +#ifdef HAVE_EIO + eio_shutdown(); +#endif eet_shutdown(); embryo_shutdown(); ecore_shutdown(); @@ -159,6 +174,11 @@ _edje_lib_unref(void) EAPI int edje_shutdown(void) { + if (_edje_init_count <= 0) + { + ERR("Init count not greater than 0 in shutdown."); + return 0; + } if (--_edje_init_count != 0) return _edje_init_count; diff --git a/src/lib/edje_match.c b/src/lib/edje_match.c index f113f7b..375634e 100644 --- a/src/lib/edje_match.c +++ b/src/lib/edje_match.c @@ -449,7 +449,7 @@ edje_match_programs_exec_check_finals(const size_t *signal_finals, } static int -edje_match_callback_exec_check_finals(const Edje_Patterns *singal_ppat, +edje_match_callback_exec_check_finals(const Edje_Patterns *signal_ppat, const Edje_Patterns *source_ppat, const size_t *signal_finals, const size_t *source_finals, @@ -462,10 +462,14 @@ edje_match_callback_exec_check_finals(const Edje_Patterns *singal_ppat, Eina_Bool prop ) { + Edje_Signal_Callback *escb; + Eina_Array run; size_t i; size_t j; int r = 1; + eina_array_step_set(&run, sizeof (Eina_Array), 4); + for (i = 0; i < signal_states->size; ++i) { if (signal_states->states[i].pos >= signal_finals[signal_states->states[i].idx]) @@ -475,8 +479,6 @@ edje_match_callback_exec_check_finals(const Edje_Patterns *singal_ppat, if (signal_states->states[i].idx == source_states->states[j].idx && source_states->states[j].pos >= source_finals[source_states->states[j].idx]) { - Edje_Signal_Callback *escb; - escb = eina_list_nth(callbacks, signal_states->states[i].idx); if (escb) { @@ -484,19 +486,25 @@ edje_match_callback_exec_check_finals(const Edje_Patterns *singal_ppat, if ((!escb->just_added) && (!escb->delete_me)) { - escb->func(escb->data, ed->obj, sig, source); + eina_array_push(&run, escb); r = 2; } - if (_edje_block_break(ed)) - return 0; - if ((singal_ppat->delete_me) || (source_ppat->delete_me)) - return 0; } } } } } + while ((escb = eina_array_pop(&run))) + { + escb->func(escb->data, ed->obj, sig, source); + if (_edje_block_break(ed)) + return 0; + if ((signal_ppat->delete_me) || (source_ppat->delete_me)) + return 0; + } + eina_array_flush(&run); + return r; } diff --git a/src/lib/edje_multisense.c b/src/lib/edje_multisense.c index 43f51be..cd140f4 100644 --- a/src/lib/edje_multisense.c +++ b/src/lib/edje_multisense.c @@ -84,7 +84,7 @@ init_multisense_environment(void) strncpy(ms_factory, ms_factory_env, BUF_LEN); else strcpy(ms_factory, "multisense_factory"); - + m = _edje_module_handle_load(ms_factory); if (!m) goto err; #ifdef HAVE_LIBREMIX @@ -279,7 +279,7 @@ _player_job(void *data __UNUSED__, Ecore_Thread *th) #endif // disable and move outside of thread due to dlsym etc. thread issues // Multisense_Data * msdata = init_multisense_environment(); - + if (!msdata) return; fcntl(command_pipe[0], F_SETFL, O_NONBLOCK); @@ -290,13 +290,17 @@ _player_job(void *data __UNUSED__, Ecore_Thread *th) { if (!msdata->remaining) { - //Cleanup already played sound sources + int err; + + //Cleanup already played sound sources EINA_LIST_FREE(msdata->snd_src_list, sound) { remix_destroy(msdata->msenv->remixenv, sound); } //wait for new sound - select(command_pipe[0] + 1, &wait_fds, NULL, NULL, 0); + err = select(command_pipe[0] + 1, &wait_fds, NULL, NULL, 0); + if (ecore_thread_check(th)) + break; } //read sound command , if any sound_command_handler(msdata); @@ -340,8 +344,13 @@ _edje_multisense_internal_sound_sample_play(Edje *ed, const char *sample_name, c ssize_t size = 0; #if defined(ENABLE_MULTISENSE) && defined(HAVE_LIBREMIX) Edje_Multisense_Sound_Action command; - + if ((!pipe_initialized) && (!player_thread)) return EINA_FALSE; + if (!sample_name) + { + ERR("Given Sample Name is NULL\n"); + return EINA_FALSE; + } command.action = EDJE_PLAY_SAMPLE; command.ed = ed; @@ -363,14 +372,20 @@ _edje_multisense_internal_sound_tone_play(Edje *ed, const char *tone_name, const ssize_t size = 0; #if defined(ENABLE_MULTISENSE) && defined(HAVE_LIBREMIX) Edje_Multisense_Sound_Action command; - + if ((!pipe_initialized) && (!player_thread)) return EINA_FALSE; + if (!tone_name) + { + ERR("Given Tone Name is NULL\n"); + return EINA_FALSE; + } + command.action = EDJE_PLAY_TONE; command.ed = ed; strncpy(command.type.tone.tone_name, tone_name, BUF_LEN); command.type.tone.duration = duration; size = write(command_pipe[1], &command, sizeof(command)); -#else +#else // warning shh (void) ed; (void) duration; @@ -390,8 +405,9 @@ _edje_multisense_init(void) // init msdata outside of thread due to thread issues in dlsym etc. if (!msdata) msdata = init_multisense_environment(); + if (!player_thread) - player_thread = ecore_thread_run(_player_job, _player_end, _player_cancel, NULL); + player_thread = ecore_thread_feedback_run(_player_job, NULL, _player_end, _player_cancel, NULL, EINA_TRUE); #endif } @@ -399,11 +415,14 @@ void _edje_multisense_shutdown(void) { #ifdef ENABLE_MULTISENSE + if (player_thread) ecore_thread_cancel(player_thread); if (pipe_initialized) { + int i = 42; + + write(command_pipe[1], &i, sizeof (int)); close(command_pipe[1]); close(command_pipe[0]); } - if (player_thread) ecore_thread_cancel(player_thread); #endif } diff --git a/src/lib/edje_private.h b/src/lib/edje_private.h index 051300f..48acb33 100644 --- a/src/lib/edje_private.h +++ b/src/lib/edje_private.h @@ -74,6 +74,10 @@ void *alloca (size_t); #endif #include <Embryo.h> +#ifdef HAVE_EIO +# include <Eio.h> +#endif + #include "Edje.h" EAPI extern int _edje_default_log_dom ; @@ -191,7 +195,7 @@ struct _Edje_Smart_Api /* increment this when you add new feature to edje file format without * breaking backward compatibility. */ -#define EDJE_FILE_MINOR 3 +#define EDJE_FILE_MINOR 4 /* FIXME: * @@ -317,6 +321,7 @@ typedef struct _Edje_Part_Description_Spec_Box Edje_Part_Description_Spec_ typedef struct _Edje_Part_Description_Spec_Table Edje_Part_Description_Spec_Table; typedef struct _Edje_Patterns Edje_Patterns; typedef struct _Edje_Part_Box_Animation Edje_Part_Box_Animation; +typedef struct _Edje_Part_Limit Edje_Part_Limit; typedef struct _Edje Edje; typedef struct _Edje_Real_Part_State Edje_Real_Part_State; @@ -467,6 +472,13 @@ struct _Edje_File Eet_File *ef; +#ifdef HAVE_EIO + Eio_Monitor *monitor; + Eina_List *edjes; + Eina_List *handlers; + Ecore_Timer *timeout; +#endif + unsigned char free_strings : 1; unsigned char dangling : 1; unsigned char warning : 1; @@ -665,6 +677,7 @@ struct _Edje_Limit TYPE GROUP; \ TYPE BOX; \ TYPE TABLE; \ + TYPE SPACER; \ TYPE EXTERNAL; struct _Edje_Part_Collection_Directory_Entry @@ -715,6 +728,21 @@ struct _Edje_Pack_Element unsigned short colspan, rowspan; }; +typedef enum { + EDJE_PART_LIMIT_UNKNOWN = 0, + EDJE_PART_LIMIT_BELOW, + EDJE_PART_LIMIT_ZERO, + EDJE_PART_LIMIT_OVER +} Edje_Part_Limit_State; + +struct _Edje_Part_Limit +{ + int part; + + Edje_Part_Limit_State width; /* -1, 0 or 1 */ + Edje_Part_Limit_State height; /* -1, 0, or 1 */ +}; + /*----------*/ struct _Edje_Part_Collection @@ -742,6 +770,9 @@ struct _Edje_Part_Collection Edje_Limit **horizontal; unsigned int horizontal_count; + + Edje_Part_Limit *parts; + unsigned int parts_count; } limits; Edje_Part **parts; /* an array of Edje_Part */ @@ -838,6 +869,7 @@ struct _Edje_Part unsigned char select_mode; unsigned char cursor_mode; unsigned char multiline; + unsigned char access; /* it will be used accessibility feature */ Edje_Part_Api api; }; @@ -902,6 +934,7 @@ struct _Edje_Part_Description_Common } persp; unsigned char visible; /* is it shown */ + unsigned char limit; /* 0 == no, 1 = width, 2 = height, 3 = both */ }; struct _Edje_Part_Description_Spec_Fill @@ -1149,9 +1182,12 @@ struct _Edje void *data; } item_provider; + Eina_List *user_defined; + + int walking_callbacks; + unsigned int dirty : 1; unsigned int recalc : 1; - unsigned int walking_callbacks : 1; unsigned int delete_callbacks : 1; unsigned int just_added_callbacks : 1; unsigned int have_objects : 1; @@ -1192,6 +1228,7 @@ struct _Edje_Calc_Params union { struct { int l, r, t, b; // 16 + FLOAT_T border_scale_by; } image; // 16 } spec; // 16 } common; // 40 @@ -1536,6 +1573,52 @@ struct _Edje_Patterns size_t finals[]; }; +typedef enum _Edje_User_Defined_Type +{ + EDJE_USER_SWALLOW, + EDJE_USER_BOX_PACK, + EDJE_USER_TABLE_PACK, + EDJE_USER_STRING, + EDJE_USER_DRAG_STEP, + EDJE_USER_DRAG_PAGE, + EDJE_USER_DRAG_VALUE, + EDJE_USER_DRAG_SIZE +} Edje_User_Defined_Type; + +typedef struct _Edje_User_Defined Edje_User_Defined; +struct _Edje_User_Defined +{ + Edje_User_Defined_Type type; + const char *part; + Edje *ed; + + union { + struct { + const char *text; + } string; + struct { + Evas_Object *child; + } swallow; + struct { + Evas_Object *child; + int index; + } box; + struct { + Evas_Object *child; + unsigned short col; + unsigned short row; + unsigned short colspan; + unsigned short rowspan; + } table; + struct { + double x, y; + } drag_position; + struct { + double w, h; + } drag_size; + } u; +}; + Edje_Patterns *edje_match_collection_dir_init(const Eina_List *lst); Edje_Patterns *edje_match_programs_signal_init(Edje_Program * const *array, unsigned int count); @@ -1609,6 +1692,7 @@ extern Eina_Mempool *_emp_GROUP; extern Eina_Mempool *_emp_BOX; extern Eina_Mempool *_emp_TABLE; extern Eina_Mempool *_emp_EXTERNAL; +extern Eina_Mempool *_emp_SPACER; extern Eina_Mempool *_emp_part; void _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, FLOAT_T pos, FLOAT_T v1, FLOAT_T v2); @@ -1809,7 +1893,7 @@ void _edje_textblock_styles_del(Edje *ed); void _edje_textblock_style_all_update(Edje *ed); void _edje_textblock_style_parse_and_fix(Edje_File *edf); void _edje_textblock_style_cleanup(Edje_File *edf); -Edje_File *_edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret); +Edje_File *_edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, Edje_Part_Collection **edc_ret, Edje *ed); void _edje_cache_coll_clean(Edje_File *edf); void _edje_cache_coll_flush(Edje_File *edf); void _edje_cache_coll_unref(Edje_File *edf, Edje_Part_Collection *edc); @@ -1818,6 +1902,7 @@ void _edje_cache_file_unref(Edje_File *edf); void _edje_embryo_globals_init(Edje *ed); #define CHKPARAM(n) if (params[0] != (sizeof(Embryo_Cell) * (n))) return -1; +#define HASNPARAMS(n) (params[0] == (sizeof(Embryo_Cell) * (n))) #define GETSTR(str, par) { \ Embryo_Cell *___cptr; \ int ___l; \ @@ -2057,6 +2142,7 @@ void _edje_lib_ref(void); void _edje_lib_unref(void); void _edje_subobj_register(Edje *ed, Evas_Object *ob); +void _edje_subobj_unregister(Edje *ed, Evas_Object *ob); void _edje_multisense_init(void); void _edje_multisense_shutdown(void); @@ -2065,6 +2151,9 @@ Eina_Bool _edje_multisense_internal_sound_tone_play(Edje *ed, const char *tone_n void _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *state); +void _edje_user_definition_remove(Edje_User_Defined *eud, Evas_Object *child); +void _edje_user_definition_free(Edje_User_Defined *eud); + #ifdef HAVE_LIBREMIX #include <remix/remix.h> #endif diff --git a/src/lib/edje_program.c b/src/lib/edje_program.c index 648e8ee..3346cf8 100644 --- a/src/lib/edje_program.c +++ b/src/lib/edje_program.c @@ -992,7 +992,7 @@ _edje_emit_full(Edje *ed, const char *sig, const char *src, void *data, void (*f break ; default: - ERR("SPANK SPANK SPANK !!!\nYou should never be here !"); +// ERR("SPANK SPANK SPANK !!!\nYou should never be here !"); break; } } @@ -1148,21 +1148,16 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src, Edje_Real_Part *rp; rp = _edje_real_part_get(ed, pr->filter.part ? pr->filter.part : src); - if (rp && !rp->program) - exec = (rp->chosen_description->state.name == pr->filter.state); - } - - pr->exec = exec; -#if 0 - if (exec) - { - _edje_program_run(ed, pr, 0, sig, src); - if (_edje_block_break(ed)) + if (rp) { - goto break_prog; + if (rp->program) + exec = EINA_FALSE; + else + exec = (rp->chosen_description->state.name == pr->filter.state); } } -#endif + + pr->exec = exec; } EINA_LIST_FOREACH(matches, l, pr) @@ -1280,7 +1275,7 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da if (ed->just_added_callbacks) _edje_callbacks_patterns_clean(ed); - ed->walking_callbacks = 1; + ed->walking_callbacks++; if (ed->callbacks) { @@ -1312,14 +1307,15 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da { escb->func(escb->data, ed->obj, sig, src); if (_edje_block_break(ed)) - goto break_prog; + break; } } } break_prog: - ed->walking_callbacks = 0; - if ((ed->delete_callbacks) || (ed->just_added_callbacks)) + ed->walking_callbacks--; + if (!ed->walking_callbacks && + ((ed->delete_callbacks) || (ed->just_added_callbacks))) { ed->delete_callbacks = 0; ed->just_added_callbacks = 0; diff --git a/src/lib/edje_smart.c b/src/lib/edje_smart.c index 59ccc46..2c74c50 100644 --- a/src/lib/edje_smart.c +++ b/src/lib/edje_smart.c @@ -112,6 +112,7 @@ _edje_smart_add(Evas_Object *obj) ed->is_rtl = EINA_FALSE; ed->have_objects = 1; ed->references = 1; + ed->user_defined = NULL; evas_object_geometry_get(obj, &(ed->x), &(ed->y), &(ed->w), &(ed->h)); ed->obj = obj; diff --git a/src/lib/edje_text.c b/src/lib/edje_text.c index 01faf99..8d81159 100644 --- a/src/lib/edje_text.c +++ b/src/lib/edje_text.c @@ -587,17 +587,17 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, part_get_geometry(ep, &tw, &th); /* Handle alignment */ { - double align_x; - if (params->type.text.align.x < 0.0) + FLOAT_T align_x; + if (params->type.text.align.x < FROM_INT(0)) { if (evas_object_text_direction_get(ep->object) == EVAS_BIDI_DIRECTION_RTL) { - align_x = 1.0; + align_x = FROM_INT(1); } else { - align_x = 0.0; + align_x = FROM_INT(0); } } else diff --git a/src/lib/edje_textblock_styles.c b/src/lib/edje_textblock_styles.c index 13a68ad..bf7f330 100644 --- a/src/lib/edje_textblock_styles.c +++ b/src/lib/edje_textblock_styles.c @@ -176,7 +176,13 @@ _edje_textblock_style_all_update(Edje *ed) /* Make sure the style contains a text_class */ EINA_LIST_FOREACH(stl->tags, ll, tag) - if (tag->text_class) found = 1; + { + if (tag->text_class) + { + found = 1; + break; + } + } /* No text classes , goto next style */ if (!found) continue; @@ -198,11 +204,7 @@ _edje_textblock_style_all_update(Edje *ed) eina_strbuf_append(txt, "='"); /* Configure fonts from text class if it exists */ - if ((tc = _edje_text_class_find(ed, tag->text_class))) - { - /* Only update if not clearing, If clear leave it at zero */ - if (tc->font) found = 1; - } + tc = _edje_text_class_find(ed, tag->text_class); /* Add and Ha`ndle tag parsed data */ eina_strbuf_append(txt, tag->value); @@ -223,7 +225,7 @@ _edje_textblock_style_all_update(Edje *ed) { char font_size[32]; - if (found) + if (tc && tc->size) snprintf(font_size, sizeof(font_size), "%f", (double) _edje_text_size_calc(tag->font_size, tc)); else snprintf(font_size, sizeof(font_size), "%f", tag->font_size); @@ -240,10 +242,9 @@ _edje_textblock_style_all_update(Edje *ed) eina_strbuf_append(txt, " "); eina_strbuf_append(txt, "font="); - f = (found) ? tc->font : tag->font; + f = (tc && tc->font) ? tc->font : tag->font; eina_strbuf_append_escaped(txt, f); } - found = 0; eina_strbuf_append(txt, "'"); } diff --git a/src/lib/edje_util.c b/src/lib/edje_util.c index 07678f4..090e7a5 100644 --- a/src/lib/edje_util.c +++ b/src/lib/edje_util.c @@ -46,9 +46,95 @@ static Eina_Bool _edje_color_class_list_foreach(const Eina_Hash *hash, const voi static Eina_Bool _edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata); static void _edje_object_image_preload_cb(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _edje_object_signal_preload_cb(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _edje_user_def_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__); +static void _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child); +static void _edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child); Edje_Real_Part *_edje_real_part_recursive_get_helper(const Edje *ed, char **path); +static Edje_User_Defined * +_edje_user_definition_new(Edje_User_Defined_Type type, const char *part, Edje *ed) +{ + Edje_User_Defined *eud; + + eud = malloc(sizeof (Edje_User_Defined)); + if (!eud) return NULL; + + eud->type = type; + eud->part = eina_stringshare_add(part); + eud->ed = ed; + ed->user_defined = eina_list_append(ed->user_defined, eud); + + return eud; +} + +void +_edje_user_definition_remove(Edje_User_Defined *eud, Evas_Object *child) +{ + eud->ed->user_defined = eina_list_remove(eud->ed->user_defined, eud); + + if (child) evas_object_event_callback_del_full(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud); + eina_stringshare_del(eud->part); + free(eud); +} + +void +_edje_user_definition_free(Edje_User_Defined *eud) +{ + Evas_Object *child = NULL; + Edje_Real_Part *rp; + + eud->ed->user_defined = eina_list_remove(eud->ed->user_defined, eud); + + switch (eud->type) + { + case EDJE_USER_SWALLOW: + child = eud->u.swallow.child; + rp = _edje_real_part_recursive_get(eud->ed, eud->part); + if (rp) + { + _edje_real_part_swallow_clear(rp); + rp->swallowed_object = NULL; + rp->swallow_params.min.w = 0; + rp->swallow_params.min.h = 0; + rp->swallow_params.max.w = 0; + rp->swallow_params.max.h = 0; + rp->edje->dirty = 1; + rp->edje->recalc_call = 1; +#ifdef EDJE_CALC_CACHE + rp->invalidate = 1; +#endif + _edje_recalc_do(rp->edje); + } + break; + case EDJE_USER_BOX_PACK: + child = eud->u.box.child; + rp = _edje_real_part_recursive_get(eud->ed, eud->part); + _edje_box_child_remove(rp, child); + break; + case EDJE_USER_TABLE_PACK: + child = eud->u.table.child; + rp = _edje_real_part_recursive_get(eud->ed, eud->part); + _edje_table_child_remove(rp, child); + break; + case EDJE_USER_STRING: + case EDJE_USER_DRAG_STEP: + case EDJE_USER_DRAG_PAGE: + case EDJE_USER_DRAG_VALUE: + case EDJE_USER_DRAG_SIZE: + break; + } + + _edje_user_definition_remove(eud, child); +} + +static void +_edje_user_def_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__) +{ + Edje_User_Defined *eud = data; + + _edje_user_definition_free(eud); +} static void _edje_class_member_direct_del(const char *class, Edje_List_Refcount *lookup, Eina_Hash *hash) @@ -145,7 +231,6 @@ edje_freeze(void) { #ifdef FASTFREEZE _edje_freeze_val++; - INF("fr ++ ->%i", _edje_freeze_val); #else // FIXME: could just have a global freeze instead of per object // above i tried.. but this broke some things. notable e17's menus. why? @@ -185,7 +270,6 @@ edje_thaw(void) { #ifdef FASTFREEZE _edje_freeze_val--; - INF("fr -- ->%i", _edje_freeze_val); if ((_edje_freeze_val <= 0) && (_edje_freeze_calc_count > 0)) { Edje *ed; @@ -732,23 +816,19 @@ edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size siz tc->font = eina_stringshare_add(font); tc->size = size; - return EINA_FALSE; } - - /* If the class found is the same just return */ - if ((tc->size == size) && (tc->font) && (!strcmp(tc->font, font))) - return EINA_TRUE; - - /* Update the class found */ - eina_stringshare_del(tc->font); - tc->font = eina_stringshare_add(font); - if (!tc->font) + else { - eina_hash_del(_edje_text_class_hash, text_class, tc); - free(tc); - return EINA_FALSE; + /* Match and the same, return */ + if ((tc->size == size) || + (tc->font == font) || + (tc->font && font && !strcmp(tc->font, font))) + return EINA_TRUE; + + /* Update the class found */ + eina_stringshare_replace(&tc->font, font); + tc->size = size; } - tc->size = size; /* Tell all members of the text class to recalc */ members = eina_hash_find(_edje_text_class_member_hash, text_class); @@ -827,7 +907,7 @@ edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char { Edje *ed; Eina_List *l; - Edje_Text_Class *tc; + Edje_Text_Class *tc = NULL; unsigned int i; ed = _edje_fetch(obj); @@ -839,42 +919,32 @@ edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char if ((tc->name) && (!strcmp(tc->name, text_class))) { /* Match and the same, return */ - if ((tc->font) && (font) && (!strcmp(tc->font, font)) && - (tc->size == size)) - return EINA_TRUE; - - /* No font but size is the same, return */ - if ((!tc->font) && (!font) && (tc->size == size)) return EINA_TRUE; + if ((tc->size == size) || + (tc->font == font) || + (tc->font && font && !strcmp(tc->font, font))) + return EINA_TRUE; /* Update new text class properties */ - if (tc->font) eina_stringshare_del(tc->font); - if (font) tc->font = eina_stringshare_add(font); - else tc->font = NULL; + eina_stringshare_replace(&tc->font, font); tc->size = size; - - /* Update edje */ - ed->dirty = 1; - ed->recalc_call = 1; -#ifdef EDJE_CALC_CACHE - ed->text_part_change = 1; -#endif - _edje_recalc(ed); - return EINA_TRUE; + break; } } - /* No matches, create a new text class */ - tc = calloc(1, sizeof(Edje_Text_Class)); - if (!tc) return EINA_FALSE; - tc->name = eina_stringshare_add(text_class); - if (!tc->name) + if (!tc) { - free(tc); - return EINA_FALSE; + /* No matches, create a new text class */ + tc = calloc(1, sizeof(Edje_Text_Class)); + if (!tc) return EINA_FALSE; + tc->name = eina_stringshare_add(text_class); + if (!tc->name) + { + free(tc); + return EINA_FALSE; + } + tc->font = eina_stringshare_add(font); + tc->size = size; } - if (font) tc->font = eina_stringshare_add(font); - else tc->font = NULL; - tc->size = size; for (i = 0; i < ed->table_parts_size; i++) { @@ -1117,11 +1187,38 @@ edje_object_part_text_style_user_peek(const Evas_Object *obj, const char *part) return NULL; } +static void +_edje_user_define_string(Edje *ed, const char *part, const char *raw_text) +{ + /* NOTE: This one is tricky, text is referenced in rp->text.text for the life of the + rp. So on edje_object_file_set, we should first ref it, before destroying the old + layout. */ + Edje_User_Defined *eud; + Eina_List *l; + + EINA_LIST_FOREACH(ed->user_defined, l, eud) + if (eud->type == EDJE_USER_STRING && !strcmp(eud->part, part)) + { + if (!raw_text) + { + _edje_user_definition_free(eud); + return ; + } + eud->u.string.text = raw_text; + return ; + } + + eud = _edje_user_definition_new(EDJE_USER_STRING, part, ed); + if (!eud) return ; + eud->u.string.text = raw_text; +} + EAPI Eina_Bool edje_object_part_text_set(Evas_Object *obj, const char *part, const char *text) { Edje *ed; Edje_Real_Part *rp; + Eina_Bool r; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; @@ -1129,7 +1226,9 @@ edje_object_part_text_set(Evas_Object *obj, const char *part, const char *text) if (!rp) return EINA_FALSE; if ((rp->part->type != EDJE_PART_TYPE_TEXT) && (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return EINA_FALSE; - return _edje_object_part_text_raw_set(obj, rp, part, text); + r = _edje_object_part_text_raw_set(obj, rp, part, text); + _edje_user_define_string(ed, part, rp->text.text); + return r; } /** @@ -1173,6 +1272,7 @@ edje_object_part_text_escaped_set(Evas_Object *obj, const char *part, const char { Edje *ed; Edje_Real_Part *rp; + Eina_Bool ret; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; @@ -1183,7 +1283,6 @@ edje_object_part_text_escaped_set(Evas_Object *obj, const char *part, const char Eina_Strbuf *sbuf; char *esc_start = NULL, *esc_end = NULL; char *s, *p; - Eina_Bool ret; sbuf = eina_strbuf_new(); p = (char *)text; @@ -1231,11 +1330,14 @@ edje_object_part_text_escaped_set(Evas_Object *obj, const char *part, const char } ret = _edje_object_part_text_raw_set (obj, rp, part, eina_strbuf_string_get(sbuf)); + _edje_user_define_string(ed, part, rp->text.text); eina_strbuf_free(sbuf); return ret; } if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return EINA_FALSE; - return _edje_object_part_text_raw_set(obj, rp, part, text); + ret = _edje_object_part_text_raw_set(obj, rp, part, text); + _edje_user_define_string(ed, part, rp->text.text); + return ret; } @@ -1367,6 +1469,7 @@ edje_object_part_text_unescaped_set(Evas_Object *obj, const char *part, const ch ret = _edje_object_part_text_raw_set(obj, rp, part, text); free(text); } + _edje_user_define_string(ed, part, rp->text.text); return ret; } @@ -2413,6 +2516,7 @@ edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_sw { Edje *ed; Edje_Real_Part *rp; + Edje_User_Defined *eud = NULL; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; @@ -2446,6 +2550,22 @@ edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_sw return EINA_FALSE; } _edje_real_part_swallow(rp, obj_swallow, EINA_TRUE); + + if (rp->swallowed_object) + { + if (!eud) + { + eud = _edje_user_definition_new(EDJE_USER_SWALLOW, part, ed); + evas_object_event_callback_add(obj_swallow, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud); + } + else ed->user_defined = eina_list_append(ed->user_defined, eud); + + if (eud) + { + eud->u.swallow.child = obj_swallow; + } + } + return EINA_TRUE; } @@ -2713,7 +2833,7 @@ edje_box_layout_register(const char *name, Evas_Object_Box_Layout func, void *(* } EAPI void -edje_object_part_unswallow(Evas_Object *obj __UNUSED__, Evas_Object *obj_swallow) +edje_object_part_unswallow(Evas_Object *obj, Evas_Object *obj_swallow) { Edje_Real_Part *rp; @@ -2727,24 +2847,34 @@ edje_object_part_unswallow(Evas_Object *obj __UNUSED__, Evas_Object *obj_swallow ERR("cannot unswallow part %s: not swallow type!", rp->part->name); return; } + if (rp->swallowed_object == obj_swallow) { - evas_object_smart_member_del(rp->swallowed_object); - evas_object_event_callback_del_full(rp->swallowed_object, - EVAS_CALLBACK_FREE, - _edje_object_part_swallow_free_cb, - rp->edje->obj); - evas_object_event_callback_del_full(rp->swallowed_object, - EVAS_CALLBACK_CHANGED_SIZE_HINTS, - _edje_object_part_swallow_changed_hints_cb, - rp); - evas_object_clip_unset(rp->swallowed_object); - evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part"); - - if (rp->part->mouse_events) - _edje_callbacks_del(rp->swallowed_object, rp->edje); - _edje_callbacks_focus_del(rp->swallowed_object, rp->edje); + Edje_User_Defined *eud; + Eina_List *l; + + if (obj) + { + Edje *ed; + + ed = _edje_fetch(obj); + if (!ed && obj) + { + ERR("edje_object_part_unswallow called on a non Edje object ('%s').", + evas_object_type_get(obj)); + } + else + { + EINA_LIST_FOREACH(ed->user_defined, l, eud) + if (eud->type == EDJE_USER_SWALLOW && eud->u.swallow.child == obj_swallow) + { + _edje_user_definition_free(eud); + return ; + } + } + } + _edje_real_part_swallow_clear(rp); rp->swallowed_object = NULL; rp->swallow_params.min.w = 0; rp->swallow_params.min.h = 0; @@ -3134,6 +3264,8 @@ edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, d { Edje *ed; Edje_Real_Part *rp; + Edje_User_Defined *eud; + Eina_List *l; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; @@ -3141,6 +3273,24 @@ edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, d if (!rp) return EINA_FALSE; if (!rp->drag) return EINA_FALSE; if (rp->drag->down.count > 0) return EINA_FALSE; + + EINA_LIST_FOREACH(ed->user_defined, l, eud) + if (eud->type == EDJE_USER_DRAG_VALUE && !strcmp(part, eud->part)) + { + eud->u.drag_position.x = dx; + eud->u.drag_position.y = dy; + break; + } + if (!eud) + { + eud = _edje_user_definition_new(EDJE_USER_DRAG_VALUE, part, ed); + if (eud) + { + eud->u.drag_position.x = dx; + eud->u.drag_position.y = dy; + } + } + if (rp->part->dragable.confine_id != -1) { dx = CLAMP(dx, 0.0, 1.0); @@ -3199,12 +3349,32 @@ edje_object_part_drag_size_set(Evas_Object *obj, const char *part, double dw, do { Edje *ed; Edje_Real_Part *rp; + Edje_User_Defined *eud; + Eina_List *l; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; rp = _edje_real_part_recursive_get(ed, part); if (!rp) return EINA_FALSE; if (!rp->drag) return EINA_FALSE; + + EINA_LIST_FOREACH(ed->user_defined, l, eud) + if (eud->type == EDJE_USER_DRAG_SIZE && !strcmp(part, eud->part)) + { + eud->u.drag_size.w = dw; + eud->u.drag_size.h = dh; + break; + } + if (!eud) + { + eud = _edje_user_definition_new(EDJE_USER_DRAG_SIZE, part, ed); + if (eud) + { + eud->u.drag_size.w = dw; + eud->u.drag_size.h = dh; + } + } + if (dw < 0.0) dw = 0.0; else if (dw > 1.0) dw = 1.0; if (dh < 0.0) dh = 0.0; @@ -3255,12 +3425,32 @@ edje_object_part_drag_step_set(Evas_Object *obj, const char *part, double dx, do { Edje *ed; Edje_Real_Part *rp; + Edje_User_Defined *eud; + Eina_List *l; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; rp = _edje_real_part_recursive_get(ed, part); if (!rp) return EINA_FALSE; if (!rp->drag) return EINA_FALSE; + + EINA_LIST_FOREACH(ed->user_defined, l, eud) + if (eud->type == EDJE_USER_DRAG_STEP && !strcmp(part, eud->part)) + { + eud->u.drag_position.x = dx; + eud->u.drag_position.y = dy; + break; + } + if (!eud) + { + eud = _edje_user_definition_new(EDJE_USER_DRAG_STEP, part, ed); + if (eud) + { + eud->u.drag_position.x = dx; + eud->u.drag_position.y = dy; + } + } + if (dx < 0.0) dx = 0.0; else if (dx > 1.0) dx = 1.0; if (dy < 0.0) dy = 0.0; @@ -3307,12 +3497,32 @@ edje_object_part_drag_page_set(Evas_Object *obj, const char *part, double dx, do { Edje *ed; Edje_Real_Part *rp; + Edje_User_Defined *eud; + Eina_List *l; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; rp = _edje_real_part_recursive_get(ed, part); if (!rp) return EINA_FALSE; if (!rp->drag) return EINA_FALSE; + + EINA_LIST_FOREACH(ed->user_defined, l, eud) + if (eud->type == EDJE_USER_DRAG_PAGE && !strcmp(part, eud->part)) + { + eud->u.drag_position.x = dx; + eud->u.drag_position.y = dy; + break; + } + if (!eud) + { + eud = _edje_user_definition_new(EDJE_USER_DRAG_PAGE, part, ed); + if (eud) + { + eud->u.drag_position.x = dx; + eud->u.drag_position.y = dy; + } + } + if (dx < 0.0) dx = 0.0; else if (dx > 1.0) dx = 1.0; if (dy < 0.0) dy = 0.0; @@ -3360,6 +3570,8 @@ edje_object_part_drag_step(Evas_Object *obj, const char *part, double dx, double Edje *ed; Edje_Real_Part *rp; FLOAT_T px, py; + Edje_User_Defined *eud; + Eina_List *l; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; @@ -3367,6 +3579,24 @@ edje_object_part_drag_step(Evas_Object *obj, const char *part, double dx, double if (!rp) return EINA_FALSE; if (!rp->drag) return EINA_FALSE; if (rp->drag->down.count > 0) return EINA_FALSE; + + EINA_LIST_FOREACH(ed->user_defined, l, eud) + if (eud->type == EDJE_USER_DRAG_STEP && !strcmp(part, eud->part)) + { + eud->u.drag_position.x = dx; + eud->u.drag_position.y = dy; + break; + } + if (!eud) + { + eud = _edje_user_definition_new(EDJE_USER_DRAG_STEP, part, ed); + if (eud) + { + eud->u.drag_position.x = dx; + eud->u.drag_position.y = dy; + } + } + px = rp->drag->val.x; py = rp->drag->val.y; rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx), @@ -3390,6 +3620,8 @@ edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double Edje *ed; Edje_Real_Part *rp; FLOAT_T px, py; + Edje_User_Defined *eud; + Eina_List *l; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; @@ -3397,6 +3629,24 @@ edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double if (!rp) return EINA_FALSE; if (!rp->drag) return EINA_FALSE; if (rp->drag->down.count > 0) return EINA_FALSE; + + EINA_LIST_FOREACH(ed->user_defined, l, eud) + if (eud->type == EDJE_USER_DRAG_PAGE && !strcmp(part, eud->part)) + { + eud->u.drag_position.x = dx; + eud->u.drag_position.y = dy; + break; + } + if (!eud) + { + eud = _edje_user_definition_new(EDJE_USER_DRAG_PAGE, part, ed); + if (eud) + { + eud->u.drag_position.x = dx; + eud->u.drag_position.y = dy; + } + } + px = rp->drag->val.x; py = rp->drag->val.y; rp->drag->val.x = ADD(px, MUL(FROM_DOUBLE(dx), MUL(rp->drag->page.x, rp->part->dragable.x))); @@ -3434,6 +3684,7 @@ edje_object_part_box_append(Evas_Object *obj, const char *part, Evas_Object *chi { Edje *ed; Edje_Real_Part *rp; + Eina_Bool r; ed = _edje_fetch(obj); if ((!ed) || (!part) || (!child)) return EINA_FALSE; @@ -3442,7 +3693,20 @@ edje_object_part_box_append(Evas_Object *obj, const char *part, Evas_Object *chi if (!rp) return EINA_FALSE; if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE; - return _edje_real_part_box_append(rp, child); + r = _edje_real_part_box_append(rp, child); + + if (r) + { + Edje_User_Defined *eud; + + eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed); + if (!eud) return r; + eud->u.box.child = child; + eud->u.box.index = -1; + + evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud); + } + return r; } EAPI Eina_Bool @@ -3450,6 +3714,7 @@ edje_object_part_box_prepend(Evas_Object *obj, const char *part, Evas_Object *ch { Edje *ed; Edje_Real_Part *rp; + Eina_Bool r; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; @@ -3458,7 +3723,19 @@ edje_object_part_box_prepend(Evas_Object *obj, const char *part, Evas_Object *ch if (!rp) return EINA_FALSE; if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE; - return _edje_real_part_box_prepend(rp, child); + r = _edje_real_part_box_prepend(rp, child); + + if (r) + { + Edje_User_Defined *eud; + + eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed); + if (!eud) return r; + eud->u.box.child = child; + + evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud); + } + return r; } EAPI Eina_Bool @@ -3466,6 +3743,7 @@ edje_object_part_box_insert_before(Evas_Object *obj, const char *part, Evas_Obje { Edje *ed; Edje_Real_Part *rp; + Eina_Bool r; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; @@ -3474,7 +3752,19 @@ edje_object_part_box_insert_before(Evas_Object *obj, const char *part, Evas_Obje if (!rp) return EINA_FALSE; if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE; - return _edje_real_part_box_insert_before(rp, child, reference); + r = _edje_real_part_box_insert_before(rp, child, reference); + + if (r) + { + Edje_User_Defined *eud; + + eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed); + if (!eud) return r; + eud->u.box.child = child; + + evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud); + } + return r; } EAPI Eina_Bool @@ -3482,6 +3772,7 @@ edje_object_part_box_insert_at(Evas_Object *obj, const char *part, Evas_Object * { Edje *ed; Edje_Real_Part *rp; + Eina_Bool r; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; @@ -3490,7 +3781,19 @@ edje_object_part_box_insert_at(Evas_Object *obj, const char *part, Evas_Object * if (!rp) return EINA_FALSE; if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE; - return _edje_real_part_box_insert_at(rp, child, pos); + r = _edje_real_part_box_insert_at(rp, child, pos); + + if (r) + { + Edje_User_Defined *eud; + + eud = _edje_user_definition_new(EDJE_USER_BOX_PACK, part, ed); + if (!eud) return r; + eud->u.box.child = child; + + evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud); + } + return r; } EAPI Evas_Object * @@ -3498,6 +3801,7 @@ edje_object_part_box_remove(Evas_Object *obj, const char *part, Evas_Object *chi { Edje *ed; Edje_Real_Part *rp; + Evas_Object *r; ed = _edje_fetch(obj); if ((!ed) || (!part)) return NULL; @@ -3506,7 +3810,21 @@ edje_object_part_box_remove(Evas_Object *obj, const char *part, Evas_Object *chi if (!rp) return NULL; if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL; - return _edje_real_part_box_remove(rp, child); + r = _edje_real_part_box_remove(rp, child); + + if (r) + { + Edje_User_Defined *eud; + Eina_List *l; + + EINA_LIST_FOREACH(ed->user_defined, l, eud) + if (eud->type == EDJE_USER_BOX_PACK && eud->u.box.child == child && !strcmp(eud->part, part)) + { + _edje_user_definition_free(eud); + return r; + } + } + return r; } EAPI Evas_Object * @@ -3514,6 +3832,7 @@ edje_object_part_box_remove_at(Evas_Object *obj, const char *part, unsigned int { Edje *ed; Edje_Real_Part *rp; + Evas_Object *r; ed = _edje_fetch(obj); if ((!ed) || (!part)) return NULL; @@ -3522,7 +3841,21 @@ edje_object_part_box_remove_at(Evas_Object *obj, const char *part, unsigned int if (!rp) return NULL; if (rp->part->type != EDJE_PART_TYPE_BOX) return NULL; - return _edje_real_part_box_remove_at(rp, pos); + r = _edje_real_part_box_remove_at(rp, pos); + + if (r) + { + Edje_User_Defined *eud; + Eina_List *l; + + EINA_LIST_FOREACH(ed->user_defined, l, eud) + if (eud->type == EDJE_USER_BOX_PACK && eud->u.box.child == r && !strcmp(eud->part, part)) + { + _edje_user_definition_free(eud); + return r; + } + } + return r; } EAPI Eina_Bool @@ -3530,6 +3863,7 @@ edje_object_part_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool cl { Edje *ed; Edje_Real_Part *rp; + Eina_Bool r; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; @@ -3538,8 +3872,41 @@ edje_object_part_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool cl if (!rp) return EINA_FALSE; if (rp->part->type != EDJE_PART_TYPE_BOX) return EINA_FALSE; - return _edje_real_part_box_remove_all(rp, clear); + r = _edje_real_part_box_remove_all(rp, clear); + if (r) + { + Edje_User_Defined *eud; + Eina_List *ll, *l; + + EINA_LIST_FOREACH_SAFE(ed->user_defined, l, ll, eud) + if (eud->type == EDJE_USER_BOX_PACK && !strcmp(eud->part, part)) + { + _edje_user_definition_free(eud); + return r; + } + } + return r; +} + +EAPI Eina_List * +edje_object_access_part_list_get(const Evas_Object *obj) +{ + Edje *ed; + Eina_List *access_parts = NULL; + + ed = _edje_fetch(obj); + if ((!ed)) return NULL; + + unsigned int i; + for (i = 0; i < ed->table_parts_size; i++) + { + Edje_Real_Part *rp; + rp = ed->table_parts[i]; + if (rp->part->access) + access_parts = eina_list_append(access_parts, rp->part->name); + } + return access_parts; } static void @@ -3714,10 +4081,34 @@ _edje_real_part_box_remove_all(Edje_Real_Part *rp, Eina_Bool clear) } static void -_edje_table_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__) +_edje_table_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child, void *einfo __UNUSED__) { + Edje_User_Defined *eud; + Eina_List *l; Edje_Real_Part *rp = data; + EINA_LIST_FOREACH(rp->edje->user_defined, l, eud) + if (rp->part->type == EDJE_PART_TYPE_BOX) + { + if (eud->type == EDJE_USER_BOX_PACK && + eud->u.box.child == child && + !strcmp(rp->part->name, eud->part)) + { + _edje_user_definition_free(eud); + break; + } + } + else if (rp->part->type == EDJE_PART_TYPE_TABLE) + { + if (eud->type == EDJE_USER_TABLE_PACK && + eud->u.table.child == child && + !strcmp(rp->part->name, eud->part)) + { + _edje_user_definition_free(eud); + break; + } + } + rp->edje->dirty = 1; rp->edje->recalc_call = 1; #ifdef EDJE_CALC_CACHE @@ -3755,7 +4146,7 @@ _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child) } EAPI Evas_Object * -edje_object_part_table_child_get(Evas_Object *obj, const char *part, unsigned int col, unsigned int row) +edje_object_part_table_child_get(const Evas_Object *obj, const char *part, unsigned int col, unsigned int row) { Edje *ed; Edje_Real_Part *rp; @@ -3775,6 +4166,8 @@ edje_object_part_table_pack(Evas_Object *obj, const char *part, Evas_Object *chi { Edje *ed; Edje_Real_Part *rp; + Edje_User_Defined *eud; + Eina_Bool r; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; @@ -3783,7 +4176,21 @@ edje_object_part_table_pack(Evas_Object *obj, const char *part, Evas_Object *chi if (!rp) return EINA_FALSE; if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE; - return _edje_real_part_table_pack(rp, child_obj, col, row, colspan, rowspan); + r = _edje_real_part_table_pack(rp, child_obj, col, row, colspan, rowspan); + if (r) + { + eud = _edje_user_definition_new(EDJE_USER_TABLE_PACK, part, ed); + if (!eud) return r; + + eud->u.table.child = child_obj; + eud->u.table.col = col; + eud->u.table.row = row; + eud->u.table.colspan = colspan; + eud->u.table.rowspan = rowspan; + + evas_object_event_callback_add(child_obj, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud); + } + return r; } EAPI Eina_Bool @@ -3791,6 +4198,7 @@ edje_object_part_table_unpack(Evas_Object *obj, const char *part, Evas_Object *c { Edje *ed; Edje_Real_Part *rp; + Eina_Bool r; ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; @@ -3799,7 +4207,24 @@ edje_object_part_table_unpack(Evas_Object *obj, const char *part, Evas_Object *c if (!rp) return EINA_FALSE; if (rp->part->type != EDJE_PART_TYPE_TABLE) return EINA_FALSE; - return _edje_real_part_table_unpack(rp, child_obj); + r = _edje_real_part_table_unpack(rp, child_obj); + + if (r) + { + Edje_User_Defined *eud; + Eina_List *l; + + EINA_LIST_FOREACH(ed->user_defined, l, eud) + if (eud->type == EDJE_USER_TABLE_PACK && + eud->u.table.child == child_obj && + !strcmp(part, eud->part)) + { + _edje_user_definition_free(eud); + break; + } + } + + return r; } EAPI Eina_Bool @@ -4561,12 +4986,21 @@ _edje_block_violate(Edje *ed) } void -_edje_object_part_swallow_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__) +_edje_object_part_swallow_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { - Evas_Object *edje_obj; + Edje_Real_Part *rp; + Edje_User_Defined *eud; + Eina_List *l; + + rp = data; + + EINA_LIST_FOREACH(rp->edje->user_defined, l, eud) + if (eud->type == EDJE_USER_SWALLOW && eud->u.swallow.child == obj) + { + _edje_user_definition_free(eud); + break; + } - edje_obj = data; - edje_object_part_unswallow(edje_obj, obj); return; } @@ -4640,7 +5074,7 @@ _edje_real_part_swallow_hints_update(Edje_Real_Part *rp) } rp->swallow_params.aspect.w = aw; rp->swallow_params.aspect.h = ah; - evas_object_data_set(rp->swallowed_object, "\377 edje.swallowing_part", rp); + evas_object_data_set(rp->swallowed_object, "\377 edje.swallowing_part", rp); } #ifdef EDJE_CALC_CACHE @@ -4670,8 +5104,7 @@ _edje_real_part_swallow(Edje_Real_Part *rp, { if (rp->swallowed_object != obj_swallow) { - _edje_real_part_swallow_clear(rp); - rp->swallowed_object = NULL; + edje_object_part_unswallow(rp->edje->obj, rp->swallowed_object); } else { @@ -4697,7 +5130,7 @@ _edje_real_part_swallow(Edje_Real_Part *rp, evas_object_event_callback_add(rp->swallowed_object, EVAS_CALLBACK_DEL, _edje_object_part_swallow_free_cb, - rp->edje->obj); + rp); evas_object_event_callback_add(rp->swallowed_object, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _edje_object_part_swallow_changed_hints_cb, @@ -4733,9 +5166,9 @@ _edje_real_part_swallow_clear(Edje_Real_Part *rp) { evas_object_smart_member_del(rp->swallowed_object); evas_object_event_callback_del_full(rp->swallowed_object, - EVAS_CALLBACK_FREE, + EVAS_CALLBACK_DEL, _edje_object_part_swallow_free_cb, - rp->edje->obj); + rp); evas_object_event_callback_del_full(rp->swallowed_object, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _edje_object_part_swallow_changed_hints_cb, @@ -4745,6 +5178,7 @@ _edje_real_part_swallow_clear(Edje_Real_Part *rp) if (rp->part->mouse_events) _edje_callbacks_del(rp->swallowed_object, rp->edje); _edje_callbacks_focus_del(rp->swallowed_object, rp->edje); + rp->swallowed_object = NULL; } static void @@ -4887,9 +5321,7 @@ static void _cb_subobj_del(void *data, __UNUSED__ Evas *e, Evas_Object *obj, __UNUSED__ void *event_info) { Edje *ed = data; - ed->subobjs = eina_list_remove(ed->subobjs, obj); - evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL, - _cb_subobj_del, ed); + _edje_subobj_unregister(ed, obj); } void @@ -4900,4 +5332,12 @@ _edje_subobj_register(Edje *ed, Evas_Object *ob) _cb_subobj_del, ed); } +void +_edje_subobj_unregister(Edje *ed, Evas_Object *obj) +{ + ed->subobjs = eina_list_remove(ed->subobjs, obj); + evas_object_event_callback_del_full(obj, EVAS_CALLBACK_DEL, + _cb_subobj_del, ed); +} + /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/ |