forked from enlightenment/efl
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
This commit is contained in:
parent
9d16a44334
commit
fddc27ed40
|
@ -69,6 +69,8 @@ static const char *interface_gl_x11_name = "gl_x11";
|
||||||
#endif
|
#endif
|
||||||
static const int interface_gl_x11_version = 1;
|
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;
|
typedef struct _Ecore_Evas_Engine_Data_X11 Ecore_Evas_Engine_Data_X11;
|
||||||
|
|
||||||
struct _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;
|
int state_change = 0;
|
||||||
|
|
||||||
e = event;
|
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);
|
ee = ecore_event_window_match(e->win);
|
||||||
if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
|
if ((!ee) || (ee->ignore_events)) return ECORE_CALLBACK_PASS_ON; /* pass on event */
|
||||||
edata = ee->engine.data;
|
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)
|
if (e->fully_obscured)
|
||||||
{
|
{
|
||||||
/* FIXME: round trip */
|
/* 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;
|
ee->draw_block = !edata->configured;
|
||||||
}
|
}
|
||||||
else if (ee->draw_block)
|
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 */
|
if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
|
||||||
edata = ee->engine.data;
|
edata = ee->engine.data;
|
||||||
if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
|
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->configured)
|
||||||
{
|
{
|
||||||
if (edata->fully_obscured)
|
if (edata->fully_obscured)
|
||||||
{
|
{
|
||||||
/* FIXME: round trip */
|
/* 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;
|
ee->draw_block = EINA_FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1902,11 +1909,16 @@ _ecore_evas_x_layer_update(Ecore_Evas *ee)
|
||||||
/* FIXME: Set gnome layer */
|
/* FIXME: Set gnome layer */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EAPI void ecore_x_window_root_properties_select(void);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_ecore_evas_x_init(void)
|
_ecore_evas_x_init(void)
|
||||||
{
|
{
|
||||||
_ecore_evas_init_count++;
|
_ecore_evas_init_count++;
|
||||||
if (_ecore_evas_init_count > 1) return _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_evas_event_handlers[0] =
|
||||||
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN,
|
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_IN,
|
||||||
_ecore_evas_x_event_mouse_in, NULL);
|
_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->engine.func->fn_render = _ecore_evas_x_render;
|
||||||
ee->draw_block = EINA_TRUE;
|
ee->draw_block = EINA_TRUE;
|
||||||
|
if (!wm_exists) edata->configured = 1;
|
||||||
|
|
||||||
ecore_x_input_multi_select(ee->prop.window);
|
ecore_x_input_multi_select(ee->prop.window);
|
||||||
ecore_evas_done(ee, EINA_FALSE);
|
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);
|
_ecore_evas_register(ee);
|
||||||
|
|
||||||
ee->draw_block = EINA_FALSE;
|
ee->draw_block = EINA_FALSE;
|
||||||
|
if (!wm_exists) edata->configured = 1;
|
||||||
|
|
||||||
/* ecore_x_input_multi_select(ee->prop.window); */
|
/* ecore_x_input_multi_select(ee->prop.window); */
|
||||||
/* ecore_event_window_register(ee->prop.window, ee, ee->evas, */
|
/* 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);
|
_ecore_evas_x_aux_hints_update(ee);
|
||||||
|
|
||||||
ee->draw_block = 1;
|
ee->draw_block = 1;
|
||||||
|
if (!wm_exists) edata->configured = 1;
|
||||||
|
|
||||||
ee->engine.func->fn_render = _ecore_evas_x_render;
|
ee->engine.func->fn_render = _ecore_evas_x_render;
|
||||||
ecore_x_input_multi_select(ee->prop.window);
|
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);
|
_ecore_evas_register(ee);
|
||||||
|
|
||||||
ee->draw_block = EINA_TRUE;
|
ee->draw_block = EINA_TRUE;
|
||||||
|
if (!wm_exists) edata->configured = 1;
|
||||||
|
|
||||||
/* ecore_x_input_multi_select(ee->prop.window); */
|
/* ecore_x_input_multi_select(ee->prop.window); */
|
||||||
/* ecore_event_window_register(ee->prop.window, ee, ee->evas, */
|
/* ecore_event_window_register(ee->prop.window, ee, ee->evas, */
|
||||||
|
|
Loading…
Reference in New Issue