From ab2d7a079fe56d96fdef06c0c979056a0353e915 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 25 May 2018 10:28:29 -0700 Subject: [PATCH] ecore-evas-x: set draw_block until the window receives a configure event Summary: drawing a non-override window before receiving a configure event results in an unsized window, breaking spec. it also prevents ecore-evas resize callbacks from triggering, yielding undefined returns from functions which attempt to get the geometry of the ecore-evas fix T6907 Reviewers: cedric, raster Reviewed By: cedric Subscribers: #committers, vtorri Tags: #efl Maniphest Tasks: T6907 Differential Revision: https://phab.enlightenment.org/D6019 Reviewed-by: Cedric BAIL --- src/modules/ecore_evas/engines/x/ecore_evas_x.c | 27 +++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/modules/ecore_evas/engines/x/ecore_evas_x.c b/src/modules/ecore_evas/engines/x/ecore_evas_x.c index b646190..7539884 100644 --- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c +++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c @@ -131,6 +131,8 @@ struct _Ecore_Evas_Engine_Data_X11 { unsigned long colormap; // store colormap used to create pixmap } pixmap; Eina_Bool destroyed : 1; // X window has been deleted and cannot be used + Eina_Bool fully_obscured : 1; // X window is fully obscured + Eina_Bool configured : 1; // X window has been configured }; static Ecore_Evas_Interface_X11 * _ecore_evas_x_interface_x11_new(void); @@ -1065,14 +1067,15 @@ _ecore_evas_x_event_visibility_change(void *data EINA_UNUSED, int type EINA_UNUS edata = ee->engine.data; if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; // printf("VIS CHANGE OBSCURED: %p %i\n", ee, e->fully_obscured); + edata->fully_obscured = e->fully_obscured; if (e->fully_obscured) { /* FIXME: round trip */ if (!ecore_x_screen_is_composited(edata->screen_num)) - ee->draw_ok = 0; + ee->draw_block = !edata->configured; } else - ee->draw_ok = 1; + ee->draw_block = !edata->configured; return ECORE_CALLBACK_PASS_ON; } @@ -1622,6 +1625,18 @@ _ecore_evas_x_event_window_configure(void *data EINA_UNUSED, int type EINA_UNUSE if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */ edata = ee->engine.data; if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON; + if (!edata->configured) + { + if (edata->fully_obscured) + { + /* FIXME: round trip */ + if (!ecore_x_screen_is_composited(edata->screen_num)) + ee->draw_block = EINA_FALSE; + } + else + ee->draw_block = EINA_FALSE; + } + edata->configured = 1; if (edata->direct_resize) return ECORE_CALLBACK_PASS_ON; pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_TYPE_MOUSE); @@ -3319,12 +3334,18 @@ _ecore_evas_x_reinit_win(Ecore_Evas *ee) static void _ecore_evas_x_override_set(Ecore_Evas *ee, Eina_Bool on) { + Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data; + if (ee->prop.override == on) return; if (ee->should_be_visible) ecore_x_window_hide(ee->prop.window); ecore_x_window_override_set(ee->prop.window, on); if (ee->should_be_visible) ecore_x_window_show(ee->prop.window); if (ecore_evas_focus_device_get(ee, NULL)) ecore_x_window_focus(ee->prop.window); ee->prop.override = on; + if (!on) return; + edata->configured = 1; + if (!edata->fully_obscured) + ee->draw_block = 0; } static void @@ -4668,6 +4689,8 @@ ecore_evas_gl_x11_options_new_internal(const char *disp_name, Ecore_X_Window par _ecore_evas_x_aux_hints_update(ee); _ecore_evas_x_sync_set(ee); + ee->draw_block = 1; + ee->engine.func->fn_render = _ecore_evas_x_render; ecore_x_input_multi_select(ee->prop.window); -- 2.7.4