hermet pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=ea2b5e40485a49b5c5aadae98ed379f1c3cf5f71
commit ea2b5e40485a49b5c5aadae98ed379f1c3cf5f71 Author: Hermet Park <[email protected]> Date: Tue Aug 2 22:38:30 2016 +0900 elementary widget: fix a wrong disabled behavior. This is a corner case bug I spontaneously found. * Scenario. A. Disable A widget. B. Add a child B widget to A. C. Now B Widget theme will be followed to A that is performed by elm_widget_theme_apply() D. This elm_widget_theme_apply() calls elm_widget_disabled_set() (originally.) E. Now B widget will be logically disabled. D. Let's enable A widget again. E. After going through widget disabled sequence, elm_widget_disabled_eval() will be called in the last F. In this function, A widget tries to enable its children. But B widget won't be enabled because its logically disabled! Acutally, nowhere widget change children's disabled states logically, but it propagates its state to children within volatile way so that A widget perfectly keeps the disabled/enabled state with its children and recover the children's enable/disable state once their relationship is cut off. @fix --- src/lib/elementary/elm_widget.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/lib/elementary/elm_widget.c b/src/lib/elementary/elm_widget.c index d347bdc..fe56a87 100644 --- a/src/lib/elementary/elm_widget.c +++ b/src/lib/elementary/elm_widget.c @@ -100,6 +100,8 @@ _elm_scrollable_is(const Evas_Object *obj) } static void +elm_widget_disabled_internal(Eo *obj, Eina_Bool disabled); +static void _on_sub_obj_del(void *data, const Eo_Event *event); static void _on_sub_obj_hide(void *data, const Eo_Event *event); @@ -1020,8 +1022,7 @@ EOLIAN static Elm_Theme_Apply _elm_widget_theme_apply(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED) { _elm_widget_mirrored_reload(obj); - - elm_widget_disabled_set(obj, elm_widget_disabled_get(obj)); + elm_widget_disabled_internal(obj, elm_widget_disabled_get(obj)); return ELM_THEME_APPLY_SUCCESS; } @@ -3122,12 +3123,10 @@ _elm_widget_disabled_eval(const Evas_Object *obj, Eina_Bool disabled) } } -EOLIAN static void -_elm_widget_disabled_set(Eo *obj, Elm_Widget_Smart_Data *sd, Eina_Bool disabled) +static void +elm_widget_disabled_internal(Eo *obj, Eina_Bool disabled) { Eina_Bool parent_state = EINA_FALSE; - if (sd->disabled == disabled) return; - sd->disabled = !!disabled; if (disabled) { @@ -3145,6 +3144,15 @@ _elm_widget_disabled_set(Eo *obj, Elm_Widget_Smart_Data *sd, Eina_Bool disabled) } } +EOLIAN static void +_elm_widget_disabled_set(Eo *obj, Elm_Widget_Smart_Data *sd, Eina_Bool disabled) +{ + if (sd->disabled == disabled) return; + sd->disabled = !!disabled; + + elm_widget_disabled_internal(obj, disabled); +} + EOLIAN static Eina_Bool _elm_widget_disabled_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd) { --
