summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Philippe Andre <jp.andre@samsung.com>2016-12-01 16:55:20 +0900
committerJean-Philippe Andre <jp.andre@samsung.com>2016-12-01 17:56:18 +0900
commit0891466d5f443ae94cdc9ab823dc499f6ad47ce6 (patch)
tree5c3390455447f8e4f62d7eb89e253751cad7368d
parentda7281f2aedea465ea903bd5ba6e583689f59cba (diff)
downloadefl-0891466d5f443ae94cdc9ab823dc499f6ad47ce6.tar.gz
evas: Fix infinite recursion on smart object resize
In some situations smart object resize could fall in an infinite loop even though the size was stable. Thanks @vtorri for the report!
-rw-r--r--src/lib/evas/canvas/evas_object_intercept.c7
-rw-r--r--src/lib/evas/canvas/evas_object_main.c4
-rw-r--r--src/lib/evas/include/evas_private.h2
3 files changed, 5 insertions, 8 deletions
diff --git a/src/lib/evas/canvas/evas_object_intercept.c b/src/lib/evas/canvas/evas_object_intercept.c
index f4bbe9db6e..faeedeedf7 100644
--- a/src/lib/evas/canvas/evas_object_intercept.c
+++ b/src/lib/evas/canvas/evas_object_intercept.c
@@ -132,11 +132,8 @@ _evas_object_intercept_call(Evas_Object *eo_obj, Evas_Object_Intercept_Cb_Type c
case EVAS_OBJECT_INTERCEPT_CB_RESIZE:
i = va_arg(args, int);
j = va_arg(args, int);
- if (!internal)
- {
- if (_efl_canvas_object_efl_gfx_size_set_block(eo_obj, obj, i, j))
- goto end_block;
- }
+ if (_efl_canvas_object_efl_gfx_size_set_block(eo_obj, obj, i, j, internal))
+ goto end_block;
if (!obj->interceptors) goto end_noblock;
blocked = evas_object_intercept_call_resize(eo_obj, obj, i, j);
break;
diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c
index 18df96d026..317d45abfc 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -1030,9 +1030,9 @@ evas_object_resize(Evas_Object *obj, Evas_Coord w, Evas_Coord h)
Eina_Bool
_efl_canvas_object_efl_gfx_size_set_block(Eo *eo_obj, Evas_Object_Protected_Data *obj,
- Evas_Coord w, Evas_Coord h)
+ Evas_Coord w, Evas_Coord h, Eina_Bool internal)
{
- if (obj->doing.in_resize > 0)
+ if (!internal && (obj->doing.in_resize > 0))
{
WRN("evas_object_resize() called on object %p (%s) when in the middle "
"of resizing the same object", eo_obj, efl_class_name_get(eo_obj));
diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h
index f6a011b46b..06b8c1e522 100644
--- a/src/lib/evas/include/evas_private.h
+++ b/src/lib/evas/include/evas_private.h
@@ -1707,7 +1707,7 @@ void _efl_canvas_object_clip_prev_reset(Evas_Object_Protected_Data *obj, Eina_Bo
Eina_Bool _efl_canvas_object_clip_set_block(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Object *eo_clip, Evas_Object_Protected_Data *clip);
Eina_Bool _efl_canvas_object_clip_unset_block(Eo *eo_obj, Evas_Object_Protected_Data *obj);
-Eina_Bool _efl_canvas_object_efl_gfx_size_set_block(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Coord w, Evas_Coord h);
+Eina_Bool _efl_canvas_object_efl_gfx_size_set_block(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Coord w, Evas_Coord h, Eina_Bool internal);
void _canvas_event_default_flags_set(Eo *e, void *_pd, va_list *list);
void _canvas_event_default_flags_get(Eo *e, void *_pd, va_list *list);