diff options
author | Mike Blumenkrantz <zmike@samsung.com> | 2019-09-26 11:22:44 -0400 |
---|---|---|
committer | Mike Blumenkrantz <zmike@samsung.com> | 2019-10-04 09:54:06 -0400 |
commit | 8edfe96df9fc93daecd63c8bc62b066ac6d08de2 (patch) | |
tree | 283f302559f73cc8e58807b1ff78d25f327b4517 | |
parent | 259fb3876453277f9ea290dc047e92e031d54a05 (diff) | |
download | efl-8edfe96df9fc93daecd63c8bc62b066ac6d08de2.tar.gz |
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
-rw-r--r-- | src/modules/ecore_evas/engines/x/ecore_evas_x.c | 22 |
1 files 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 8c12aa44a3..c812bb494c 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 { @@ -857,6 +859,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; @@ -1048,7 +1055,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) @@ -1627,14 +1634,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 @@ -1995,11 +2002,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); @@ -4243,6 +4255,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); @@ -4460,6 +4473,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, */ @@ -4690,6 +4704,7 @@ ecore_evas_gl_x11_options_new_internal(const char *disp_name, Ecore_X_Window par _ecore_evas_x_sync_set(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); @@ -4890,6 +4905,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, */ |