path: root/src/lib/elementary
diff options
authorHermet Park <hermet@hermet.pe.kr>2016-08-02 22:38:30 +0900
committerHermet Park <hermet@hermet.pe.kr>2016-08-02 22:49:33 +0900
commitea2b5e40485a49b5c5aadae98ed379f1c3cf5f71 (patch)
tree2f363f6c2892ee38a1f478444eaa5be8f9f0d506 /src/lib/elementary
parentelm scroller accel was broken by default confgis setting it to 0. fix (diff)
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
Diffstat (limited to 'src/lib/elementary')
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_disabled_set(obj, elm_widget_disabled_get(obj));
+ elm_widget_disabled_internal(obj, elm_widget_disabled_get(obj));
@@ -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)