forked from enlightenment/efl
ecore_evas_wayland: fix session recovery crash with async render
We need a display unset path for software render to prevent an async render completing after a disconnect from posting a frame and crashing us. As of this commit both software and gl session recovery work for me. fix T5005 #SessionRecoveryWorksHere
This commit is contained in:
parent
706a1a33a4
commit
3c3808acc5
|
@ -229,6 +229,26 @@ _ecore_evas_wl_common_cb_focus_out(void *data EINA_UNUSED, int type EINA_UNUSED,
|
||||||
return ECORE_CALLBACK_PASS_ON;
|
return ECORE_CALLBACK_PASS_ON;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_ee_display_unset(Ecore_Evas *ee)
|
||||||
|
{
|
||||||
|
Evas_Engine_Info_Wayland *einfo;
|
||||||
|
Ecore_Evas_Engine_Wl_Data *wdata;
|
||||||
|
|
||||||
|
einfo = (Evas_Engine_Info_Wayland *)evas_engine_info_get(ee->evas);
|
||||||
|
if (!einfo) return;
|
||||||
|
|
||||||
|
einfo->info.wl_display = NULL;
|
||||||
|
einfo->info.wl_surface = NULL;
|
||||||
|
|
||||||
|
wdata = ee->engine.data;
|
||||||
|
if (!strcmp(ee->driver, "wayland_egl"))
|
||||||
|
wdata->regen_objs = _evas_canvas_image_data_unset(ecore_evas_get(ee));
|
||||||
|
|
||||||
|
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
|
||||||
|
WRN("Failed to set Evas Engine Info for '%s'", ee->driver);
|
||||||
|
}
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_ecore_evas_wl_common_cb_disconnect(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
_ecore_evas_wl_common_cb_disconnect(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
||||||
{
|
{
|
||||||
|
@ -248,8 +268,7 @@ _ecore_evas_wl_common_cb_disconnect(void *data EINA_UNUSED, int type EINA_UNUSED
|
||||||
ee->visible = EINA_FALSE;
|
ee->visible = EINA_FALSE;
|
||||||
wdata->reset_pending = 1;
|
wdata->reset_pending = 1;
|
||||||
ecore_evas_manual_render_set(ee, 1);
|
ecore_evas_manual_render_set(ee, 1);
|
||||||
if (wdata->display_unset)
|
_ee_display_unset(ee);
|
||||||
wdata->display_unset(ee);
|
|
||||||
}
|
}
|
||||||
return ECORE_CALLBACK_RENEW;
|
return ECORE_CALLBACK_RENEW;
|
||||||
}
|
}
|
||||||
|
@ -1958,22 +1977,6 @@ _ecore_evas_wl_common_rotation_set(Ecore_Evas *ee, int rotation, int resize)
|
||||||
_rotation_do(ee, rotation, resize);
|
_rotation_do(ee, rotation, resize);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
_ee_egl_display_unset(Ecore_Evas *ee)
|
|
||||||
{
|
|
||||||
Evas_Engine_Info_Wayland *einfo;
|
|
||||||
Ecore_Evas_Engine_Wl_Data *wdata;
|
|
||||||
|
|
||||||
einfo = (Evas_Engine_Info_Wayland *)evas_engine_info_get(ee->evas);
|
|
||||||
if (!einfo) return;
|
|
||||||
|
|
||||||
einfo->info.wl_display = NULL;
|
|
||||||
wdata = ee->engine.data;
|
|
||||||
wdata->regen_objs = _evas_canvas_image_data_unset(ecore_evas_get(ee));
|
|
||||||
if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo))
|
|
||||||
WRN("Failed to set Evas Engine Info for '%s'", ee->driver);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_ee_cb_sync_done(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
|
_ee_cb_sync_done(void *data, int type EINA_UNUSED, void *event EINA_UNUSED)
|
||||||
{
|
{
|
||||||
|
@ -2188,8 +2191,6 @@ _ecore_evas_wl_common_new_internal(const char *disp_name, unsigned int parent, i
|
||||||
wdata->sync_done = EINA_FALSE;
|
wdata->sync_done = EINA_FALSE;
|
||||||
wdata->parent = p;
|
wdata->parent = p;
|
||||||
wdata->display = ewd;
|
wdata->display = ewd;
|
||||||
if (!strcmp(engine_name, "wayland_egl"))
|
|
||||||
wdata->display_unset = _ee_egl_display_unset;
|
|
||||||
|
|
||||||
wdata->win = ecore_wl2_window_new(ewd, p, x, y, w + fw, h + fh);
|
wdata->win = ecore_wl2_window_new(ewd, p, x, y, w + fw, h + fh);
|
||||||
ee->prop.window = ecore_wl2_window_id_get(wdata->win);
|
ee->prop.window = ecore_wl2_window_id_get(wdata->win);
|
||||||
|
|
|
@ -36,7 +36,6 @@ typedef struct _Ecore_Evas_Engine_Wl_Data Ecore_Evas_Engine_Wl_Data;
|
||||||
struct _Ecore_Evas_Engine_Wl_Data
|
struct _Ecore_Evas_Engine_Wl_Data
|
||||||
{
|
{
|
||||||
Ecore_Wl2_Display *display;
|
Ecore_Wl2_Display *display;
|
||||||
void (*display_unset)(Ecore_Evas*);
|
|
||||||
Eina_List *regen_objs;
|
Eina_List *regen_objs;
|
||||||
Ecore_Wl2_Window *parent, *win;
|
Ecore_Wl2_Window *parent, *win;
|
||||||
Ecore_Event_Handler *sync_handler;
|
Ecore_Event_Handler *sync_handler;
|
||||||
|
|
Loading…
Reference in New Issue