summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Edje.h63
-rw-r--r--src/lib/Makefile.am9
-rw-r--r--src/lib/edje_cache.c71
-rw-r--r--src/lib/edje_calc.c198
-rw-r--r--src/lib/edje_data.c29
-rw-r--r--src/lib/edje_edit.c11
-rw-r--r--src/lib/edje_embryo.c12
-rw-r--r--src/lib/edje_entry.c136
-rw-r--r--src/lib/edje_load.c288
-rw-r--r--src/lib/edje_lua2.c68
-rw-r--r--src/lib/edje_main.c30
-rw-r--r--src/lib/edje_match.c24
-rw-r--r--src/lib/edje_multisense.c37
-rw-r--r--src/lib/edje_private.h95
-rw-r--r--src/lib/edje_program.c30
-rw-r--r--src/lib/edje_smart.c1
-rw-r--r--src/lib/edje_text.c8
-rw-r--r--src/lib/edje_textblock_styles.c19
-rw-r--r--src/lib/edje_util.c616
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 :*/