zmike pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=95b5731461c53df2691ef43db61f321de5b366d3
commit 95b5731461c53df2691ef43db61f321de5b366d3 Author: Mike Blumenkrantz <zm...@samsung.com> Date: Mon Oct 14 09:30:23 2019 -0400 elm/layout: add some workarounds to try handling legacy min sizes Summary: if a legacy widget calls evas_object_size_hint_min_set, this actually sets efl_gfx_hint_size_restricted_min now, which is supposed to be the hint that is used internally by widgets. as a result, there is a conflict between the size which the user expects and the size which the widget tries to calculate. the user size should always be respected, however, so this adds some tracking to determine whether the layout's min size was set by the layout during its own calc or by something externally @fix Reviewers: eagleeye, CHAN, woohyun, Jaehyun_Cho, cedric Reviewed By: cedric Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D10373 --- src/lib/elementary/efl_ui_layout.c | 18 ++++++++++++++++-- src/lib/elementary/efl_ui_layout_legacy_eo.c | 1 + src/lib/elementary/elm_widget_layout.h | 2 ++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/lib/elementary/efl_ui_layout.c b/src/lib/elementary/efl_ui_layout.c index 25a09a1503..28e99a1c84 100644 --- a/src/lib/elementary/efl_ui_layout.c +++ b/src/lib/elementary/efl_ui_layout.c @@ -175,6 +175,7 @@ _sizing_eval(Evas_Object *obj, Efl_Ui_Layout_Data *sd, Elm_Layout_Data *ld) ELM_WIDGET_DATA_GET_OR_RETURN(sd->obj, wd); if (!efl_alive_get(obj)) return; + if (ld) ld->in_calc = EINA_TRUE; if (sd->calc_subobjs && !evas_smart_objects_calculating_get(evas_object_evas_get(obj))) { @@ -186,7 +187,7 @@ _sizing_eval(Evas_Object *obj, Efl_Ui_Layout_Data *sd, Elm_Layout_Data *ld) } elm_coords_finger_size_adjust(sd->finger_size_multiplier_x, &rest_w, sd->finger_size_multiplier_y, &rest_h); - if (ld) + if (ld && ld->user_min_sz) sz = efl_gfx_hint_size_combined_min_get(obj); else sz = efl_gfx_hint_size_min_get(obj); @@ -218,7 +219,7 @@ _sizing_eval(Evas_Object *obj, Efl_Ui_Layout_Data *sd, Elm_Layout_Data *ld) efl_gfx_hint_size_restricted_min_set(obj, EINA_SIZE2D(minw, minh)); if (ld) - ld->restricted_calc_w = ld->restricted_calc_h = EINA_FALSE; + ld->in_calc = ld->restricted_calc_w = ld->restricted_calc_h = EINA_FALSE; } void @@ -1918,6 +1919,19 @@ _elm_layout_efl_canvas_group_change(Eo *obj, Elm_Layout_Data *ld) efl_canvas_group_change(efl_super(obj, ELM_LAYOUT_MIXIN)); } +EOLIAN static void +_elm_layout_efl_gfx_hint_size_restricted_min_set(Eo *obj, Elm_Layout_Data *ld, Eina_Size2D sz) +{ + /* correctly handle legacy case where the user has set a min size hint on the object: + * in legacy code, only restricted_min existed, which resulted in conflicts between + * internal sizing and user-expected sizing. we attempt to simulate this now in a more controlled + * manner by only checking this hint during sizing calcs if the user has set it + */ + if (!ld->in_calc) + ld->user_min_sz = (sz.w > 0) || (sz.h > 0); + efl_gfx_hint_size_restricted_min_set(efl_super(obj, ELM_LAYOUT_MIXIN), sz); +} + /* layout's sizing evaluation is deferred. evaluation requests are * queued up and only flag the object as 'changed'. when it comes to * Evas's rendering phase, it will be addressed, finally (see diff --git a/src/lib/elementary/efl_ui_layout_legacy_eo.c b/src/lib/elementary/efl_ui_layout_legacy_eo.c index 33056b5c03..e08568e57d 100644 --- a/src/lib/elementary/efl_ui_layout_legacy_eo.c +++ b/src/lib/elementary/efl_ui_layout_legacy_eo.c @@ -50,6 +50,7 @@ _elm_layout_class_initializer(Efl_Class *klass) EFL_OPS_DEFINE(ops, EFL_OBJECT_OP_FUNC(elm_layout_sizing_eval, _elm_layout_sizing_eval), EFL_OBJECT_OP_FUNC(efl_canvas_group_change, _elm_layout_efl_canvas_group_change), + EFL_OBJECT_OP_FUNC(efl_gfx_hint_size_restricted_min_set, _elm_layout_efl_gfx_hint_size_restricted_min_set), ELM_LAYOUT_EXTRA_OPS ); opsp = &ops; diff --git a/src/lib/elementary/elm_widget_layout.h b/src/lib/elementary/elm_widget_layout.h index 19e3b44d27..839bb06131 100644 --- a/src/lib/elementary/elm_widget_layout.h +++ b/src/lib/elementary/elm_widget_layout.h @@ -82,6 +82,8 @@ typedef struct _Elm_Layout_Data Eina_Bool needs_size_calc : 1; /**< This flag is set true when the layout sizing eval is already requested. This defers sizing evaluation until smart calculation to avoid unnecessary calculation. */ Eina_Bool restricted_calc_w : 1; /**< This is a flag to support edje restricted_calc in w axis. */ Eina_Bool restricted_calc_h : 1; /**< This is a flag to support edje restricted_calc in y axis. */ + Eina_Bool in_calc : 1; /**< object is currently in group_calc */ + Eina_Bool user_min_sz : 1; /**< min size was set by user (legacy only has restricted min) */ } Elm_Layout_Data; /** --