diff options
author | Chris Michael <cp.michael@samsung.com> | 2016-12-02 13:02:00 -0500 |
---|---|---|
committer | Chris Michael <cp.michael@samsung.com> | 2016-12-02 14:25:10 -0500 |
commit | 4c140180d19f314cc3c6c610f9c7a0cd01e0e0a0 (patch) | |
tree | 065bc3d56fe416945905b05be149157acb72c3ec | |
parent | 6f3f514e4f31da2522fe7a23f1f228351a2ce8a3 (diff) | |
download | efl-4c140180d19f314cc3c6c610f9c7a0cd01e0e0a0.tar.gz |
ecore-wl2: Don't destroy surfaces on window hide
In order to hide a window (via wayland) we can actually assign a NULL
buffer to the surface, so there is no need to destroy the window's
wl_surface during a hide request.
Signed-off-by: Chris Michael <cp.michael@samsung.com>
-rw-r--r-- | src/lib/ecore_wl2/ecore_wl2_window.c | 72 |
1 files changed, 37 insertions, 35 deletions
diff --git a/src/lib/ecore_wl2/ecore_wl2_window.c b/src/lib/ecore_wl2/ecore_wl2_window.c index 2c19f05ec1..47f3fc85f8 100644 --- a/src/lib/ecore_wl2/ecore_wl2_window.c +++ b/src/lib/ecore_wl2/ecore_wl2_window.c @@ -338,24 +338,25 @@ surf_err: static void _ecore_wl2_window_surface_create(Ecore_Wl2_Window *window) { - if (window->surface) return; - EINA_SAFETY_ON_NULL_RETURN(window->display->wl.compositor); - window->surface = - wl_compositor_create_surface(window->display->wl.compositor); if (!window->surface) { - ERR("Failed to create surface for window"); - return; - } + window->surface = + wl_compositor_create_surface(window->display->wl.compositor); + if (!window->surface) + { + ERR("Failed to create surface for window"); + return; + } - window->surface_id = - wl_proxy_get_id((struct wl_proxy *)window->surface); + window->surface_id = + wl_proxy_get_id((struct wl_proxy *)window->surface); - if (window->display->wl.session_recovery) - zwp_e_session_recovery_add_listener(window->display->wl.session_recovery, - &_session_listener, window); + if (window->display->wl.session_recovery) + zwp_e_session_recovery_add_listener(window->display->wl.session_recovery, + &_session_listener, window); + } } EAPI Ecore_Wl2_Window * @@ -443,36 +444,14 @@ ecore_wl2_window_hide(Ecore_Wl2_Window *window) { Ecore_Wl2_Subsurface *subsurf; Eina_Inlist *tmp; - EINA_SAFETY_ON_NULL_RETURN(window); - - if (window->xdg_surface) xdg_surface_destroy(window->xdg_surface); - window->xdg_surface = NULL; - - if (window->xdg_popup) xdg_popup_destroy(window->xdg_popup); - window->xdg_popup = NULL; - if (window->wl_shell_surface) - wl_shell_surface_destroy(window->wl_shell_surface); - window->wl_shell_surface = NULL; - - if (window->www_surface) - www_surface_destroy(window->www_surface); - window->www_surface = NULL; + EINA_SAFETY_ON_NULL_RETURN(window); EINA_INLIST_FOREACH_SAFE(window->subsurfs, tmp, subsurf) _ecore_wl2_subsurf_unmap(subsurf); - if (window->uuid && window->surface && window->display->wl.session_recovery) - zwp_e_session_recovery_destroy_uuid(window->display->wl.session_recovery, - window->surface, window->uuid); - - if (window->surface) wl_surface_destroy(window->surface); - window->surface = NULL; - window->configure_serial = 0; window->configure_ack = NULL; - - window->surface_id = -1; } EAPI void @@ -493,7 +472,30 @@ ecore_wl2_window_free(Ecore_Wl2_Window *window) EINA_INLIST_FOREACH_SAFE(window->subsurfs, tmp, subsurf) _ecore_wl2_subsurf_free(subsurf); + if (window->xdg_surface) xdg_surface_destroy(window->xdg_surface); + window->xdg_surface = NULL; + + if (window->xdg_popup) xdg_popup_destroy(window->xdg_popup); + window->xdg_popup = NULL; + + if (window->wl_shell_surface) + wl_shell_surface_destroy(window->wl_shell_surface); + window->wl_shell_surface = NULL; + + if (window->www_surface) + www_surface_destroy(window->www_surface); + window->www_surface = NULL; + ecore_wl2_window_hide(window); + + if (window->uuid && window->surface && window->display->wl.session_recovery) + zwp_e_session_recovery_destroy_uuid(window->display->wl.session_recovery, + window->surface, window->uuid); + + if (window->surface) wl_surface_destroy(window->surface); + window->surface = NULL; + window->surface_id = -1; + eina_stringshare_replace(&window->uuid, NULL); if (window->title) eina_stringshare_del(window->title); |