From fddc27ed4041d792f4933110d7e6c14f1cac2bca Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 26 Sep 2019 11:22:44 -0400 Subject: [PATCH] ecore-evas/x: detect and track wm existence, apply visibility correctly Summary: this attempts to monitor the _NET_SUPPORTING_WM_CHECK atom to verify whether a wm exists, and bypasses waiting for a configure event from a nonexistent wm if the screen is not currently managed fix T7838 Depends on D10014 Reviewers: devilhorns Reviewed By: devilhorns Subscribers: devilhorns, thierry1970, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T7838 Differential Revision: https://phab.enlightenment.org/D9900 --- .../ecore_evas/engines/x/ecore_evas_x.c | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 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 590831760e..97e5fb2d10 100644 --- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c +++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c @@ -69,6 +69,8 @@ static const char *interface_gl_x11_name = "gl_x11"; #endif static const int interface_gl_x11_version = 1; +static Eina_Bool wm_exists; + typedef struct _Ecore_Evas_Engine_Data_X11 Ecore_Evas_Engine_Data_X11; struct _Ecore_Evas_Engine_Data_X11 { @@ -809,6 +811,11 @@ _ecore_evas_x_event_property_change(void *data EINA_UNUSED, int type EINA_UNUSED int state_change = 0; e = event; + if (e->win == ecore_x_window_root_first_get()) + { + if (e->atom == ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK) + wm_exists = !ecore_x_window_prop_window_get(ecore_x_window_root_first_get(), ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, NULL, 0); + } ee = ecore_event_window_match(e->win); if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */ edata = ee->engine.data; @@ -1000,7 +1007,7 @@ _ecore_evas_x_event_visibility_change(void *data EINA_UNUSED, int type EINA_UNUS if (e->fully_obscured) { /* FIXME: round trip */ - if (!ecore_x_screen_is_composited(edata->screen_num)) + if ((!wm_exists) || (!ecore_x_screen_is_composited(edata->screen_num))) ee->draw_block = !edata->configured; } else if (ee->draw_block) @@ -1543,14 +1550,14 @@ _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 ((e->from_wm) || (ee->prop.override)) + if ((!wm_exists) || (e->from_wm) || (ee->prop.override)) { if (!edata->configured) { if (edata->fully_obscured) { /* FIXME: round trip */ - if (!ecore_x_screen_is_composited(edata->screen_num)) + if ((!wm_exists) || (!ecore_x_screen_is_composited(edata->screen_num))) ee->draw_block = EINA_FALSE; } else @@ -1902,11 +1909,16 @@ _ecore_evas_x_layer_update(Ecore_Evas *ee) /* FIXME: Set gnome layer */ } +EAPI void ecore_x_window_root_properties_select(void); + static int _ecore_evas_x_init(void) { _ecore_evas_init_count++; if (_ecore_evas_init_count > 1) return _ecore_evas_init_count; + + ecore_x_window_root_properties_select(); + wm_exists = !ecore_x_window_prop_window_get(ecore_x_window_root_first_get(), ECORE_X_ATOM_NET_SUPPORTING_WM_CHECK, NULL, 0); ecore_evas_event_handlers[0] = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN, _ecore_evas_x_event_mouse_in, NULL); @@ -4100,6 +4112,7 @@ ecore_evas_software_x11_new_internal(const char *disp_name, Ecore_X_Window paren ee->engine.func->fn_render = _ecore_evas_x_render; ee->draw_block = EINA_TRUE; + if (!wm_exists) edata->configured = 1; ecore_x_input_multi_select(ee->prop.window); ecore_evas_done(ee, EINA_FALSE); @@ -4314,6 +4327,7 @@ ecore_evas_software_x11_pixmap_new_internal(const char *disp_name, Ecore_X_Windo _ecore_evas_register(ee); ee->draw_block = EINA_FALSE; + if (!wm_exists) edata->configured = 1; /* ecore_x_input_multi_select(ee->prop.window); */ /* ecore_event_window_register(ee->prop.window, ee, ee->evas, */ @@ -4533,6 +4547,7 @@ ecore_evas_gl_x11_options_new_internal(const char *disp_name, Ecore_X_Window par _ecore_evas_x_aux_hints_update(ee); ee->draw_block = 1; + if (!wm_exists) edata->configured = 1; ee->engine.func->fn_render = _ecore_evas_x_render; ecore_x_input_multi_select(ee->prop.window); @@ -4721,6 +4736,7 @@ ecore_evas_gl_x11_pixmap_new_internal(const char *disp_name, Ecore_X_Window pare _ecore_evas_register(ee); ee->draw_block = EINA_TRUE; + if (!wm_exists) edata->configured = 1; /* ecore_x_input_multi_select(ee->prop.window); */ /* ecore_event_window_register(ee->prop.window, ee, ee->evas, */