diff options
author | Hermet Park <hermet@hermet.pe.kr> | 2016-08-02 22:38:30 +0900 |
---|---|---|
committer | Hermet Park <hermet@hermet.pe.kr> | 2016-08-02 22:49:33 +0900 |
commit | ea2b5e40485a49b5c5aadae98ed379f1c3cf5f71 (patch) | |
tree | 2f363f6c2892ee38a1f478444eaa5be8f9f0d506 | |
parent | 7a70d415411cf9da302f7b1aa678913c42d18ee7 (diff) | |
download | efl-ea2b5e40485a49b5c5aadae98ed379f1c3cf5f71.tar.gz |
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
-rw-r--r-- | src/lib/elementary/elm_widget.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/src/lib/elementary/elm_widget.c b/src/lib/elementary/elm_widget.c index d347bdcc27..fe56a87ab4 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) { |