discomfitor pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=d033d747ff95bcca2fb72369ca18b3e92952cf48
commit d033d747ff95bcca2fb72369ca18b3e92952cf48 Author: Mike Blumenkrantz <zm...@osg.samsung.com> Date: Tue Apr 17 14:55:35 2018 -0400 efl_ui_win: resolve race conditions with csd sizing on first show there were some cases where frame geometry was being calculated/applied strangely as a result of moving all of the layout calcs to pre-render. enforcing a frame calc+resize resolves these issues Differential Revision: https://phab.enlightenment.org/D5961 --- src/lib/elementary/efl_ui_win.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index 17961fb757..3fccc43114 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -373,7 +373,8 @@ static void _elm_win_frame_add(Efl_Ui_Win_Data *sd, const char *element, const c static void _elm_win_frame_style_update(Efl_Ui_Win_Data *sd, Eina_Bool force_emit, Eina_Bool calc); static inline void _elm_win_need_frame_adjust(Efl_Ui_Win_Data *sd, const char *engine); static void _elm_win_resize_objects_eval(Evas_Object *obj, Eina_Bool force_resize); -static void _elm_win_frame_obj_update(Efl_Ui_Win_Data *sd); +static void _elm_win_opaque_update(Efl_Ui_Win_Data *sd, Eina_Bool force_alpha); +static void _elm_win_frame_obj_update(Efl_Ui_Win_Data *sd, Eina_Bool force); #ifdef HAVE_ELEMENTARY_X static void _elm_win_xwin_update(Efl_Ui_Win_Data *sd); @@ -992,12 +993,17 @@ _elm_win_pre_render(Ecore_Evas *ee) _elm_win_throttle_ok = EINA_TRUE; if (!sd->first_draw) { + int mw, mh; + edje_object_thaw(sd->frame_obj); evas_object_show(sd->frame_obj); _elm_win_frame_style_update(sd, 1, 1); - _elm_win_frame_obj_update(sd); ELM_WIN_DATA_ALIVE_CHECK(obj, sd); + /* force initial sizing on frame to enable sizing of content */ + edje_object_size_min_calc(sd->frame_obj, &mw, &mh); + evas_object_resize(sd->frame_obj, mw, mh); + if (sd->img_obj) { evas_object_show(sd->img_obj); @@ -1010,7 +1016,10 @@ _elm_win_pre_render(Ecore_Evas *ee) sd->first_draw = EINA_TRUE; } if (sd->deferred_resize_job) - _elm_win_resize_job(sd->obj); + { + _elm_win_resize_job(sd->obj); + _elm_win_frame_obj_update(sd, 1); + } } static void @@ -1473,7 +1482,7 @@ _elm_win_framespace_set(Efl_Ui_Win_Data *sd, int x, int y, int w, int h) } static void -_elm_win_frame_obj_update(Efl_Ui_Win_Data *sd) +_elm_win_frame_obj_update(Efl_Ui_Win_Data *sd, Eina_Bool force) { int ox, oy, ow, oh; int cx, cy, cw, ch; @@ -1483,9 +1492,12 @@ _elm_win_frame_obj_update(Efl_Ui_Win_Data *sd) _elm_win_frame_geometry_adjust(sd); evas_object_geometry_get(sd->frame_obj, &ox, &oy, &ow, &oh); edje_object_part_geometry_get(sd->frame_obj, "elm.spacer.content", &cx, &cy, &cw, &ch); - if (!_elm_win_framespace_set(sd, cx, cy, ow - cw, oh - ch)) return; + if (!_elm_win_framespace_set(sd, cx, cy, ow - cw, oh - ch) && (!force)) return; _elm_win_frame_geometry_adjust(sd); - evas_object_geometry_get(sd->obj, NULL, NULL, &w, &h); + if (sd->first_draw) + evas_object_geometry_get(sd->obj, NULL, NULL, &w, &h); + else + w = ow, h = oh; TRAP(sd, resize, w, h); } @@ -3901,7 +3913,7 @@ _elm_win_frame_obj_move(void *data, if (!(sd = data)) return; if (!sd->legacy.edje) return; - _elm_win_frame_obj_update(sd); + _elm_win_frame_obj_update(sd, 0); } static void @@ -3915,7 +3927,7 @@ _elm_win_frame_obj_resize(void *data, if (!(sd = data)) return; if (!sd->legacy.edje) return; - _elm_win_frame_obj_update(sd); + _elm_win_frame_obj_update(sd, 0); } static void @@ -4466,7 +4478,8 @@ _elm_win_frame_style_update(Efl_Ui_Win_Data *sd, Eina_Bool force_emit, Eina_Bool edje_object_message_signal_process(sd->frame_obj); if (calc) evas_object_smart_calculate(sd->frame_obj); - _elm_win_frame_obj_update(sd); + _elm_win_frame_obj_update(sd, 0); + _elm_win_opaque_update(sd, EINA_FALSE); } } @@ -4611,7 +4624,7 @@ _indicator_resized(void *data, const Efl_Event *event) Evas_Object *indicator = event->object; Evas_Coord_Size *size = (Evas_Coord_Size *)event->info; efl_gfx_size_hint_restricted_min_set(indicator, EINA_SIZE2D(size->w, size->h)); - _elm_win_frame_obj_update(sd); + _elm_win_frame_obj_update(sd, 0); } static Evas_Object* @@ -6234,7 +6247,7 @@ _win_rotate(Evas_Object *obj, Efl_Ui_Win_Data *sd, int rotation, Eina_Bool resiz #ifdef HAVE_ELEMENTARY_X _elm_win_xwin_update(sd); #endif - _elm_win_frame_obj_update(sd); + _elm_win_frame_obj_update(sd, 0); efl_ui_widget_on_orientation_update(obj, rotation); efl_event_callback_legacy_call (obj, EFL_UI_WIN_EVENT_ROTATION_CHANGED, NULL); @@ -6424,7 +6437,7 @@ _efl_ui_win_indicator_mode_set(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *sd, Efl_Ui_ edje_object_message_signal_process(sd->frame_obj); evas_object_smart_calculate(sd->frame_obj); - _elm_win_frame_obj_update(sd); + _elm_win_frame_obj_update(sd, 0); } EOLIAN static Efl_Ui_Win_Indicator_Mode --