summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Blumenkrantz <zmike@samsung.com>2019-09-26 11:22:44 -0400
committerMike Blumenkrantz <zmike@samsung.com>2019-10-04 09:54:06 -0400
commit8edfe96df9fc93daecd63c8bc62b066ac6d08de2 (patch)
tree283f302559f73cc8e58807b1ff78d25f327b4517
parent259fb3876453277f9ea290dc047e92e031d54a05 (diff)
downloadefl-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.c22
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, */