From: Carsten Haitzler (Rasterman) Date: Mon, 14 Oct 2019 18:12:25 +0000 (+0100) Subject: ecore_evas/wl2 0 fux xdg close cb for window when it's closed remotely X-Git-Tag: submit/tizen/20191111.023126~281 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e6c85189d92284e0858f84dffc97780a24a9baea;p=platform%2Fupstream%2Fefl.git ecore_evas/wl2 0 fux xdg close cb for window when it's closed remotely this should fix this: https://matrix.org/_matrix/media/r0/download/matrix.org/lhFneENlWAjuXDaJfSYuJjjJ unfortunately this means adding an api and then using it in ecore_evas. @fix --- diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h index b97c715..57ea8b5 100644 --- a/src/lib/ecore_wl2/Ecore_Wl2.h +++ b/src/lib/ecore_wl2/Ecore_Wl2.h @@ -976,6 +976,18 @@ EAPI Ecore_Wl2_Window *ecore_wl2_window_new(Ecore_Wl2_Display *display, Ecore_Wl EAPI int ecore_wl2_window_id_get(Ecore_Wl2_Window *window); /** + * Set a callback to be caleld just before the window is closed and freed + * + * @param window The window to listen to for a xdg toplevel close callback + * @param cb The callback function to call being passed data and window + * @param data The Data pointer to pass as data to the callback + * + * @ingroup Ecore_Wl2_Window_Group + * @since 1.24 + */ +EAPI void ecore_wl2_window_close_callback_set(Ecore_Wl2_Window *window, void (*cb) (void *data, Ecore_Wl2_Window *win), void *data); + +/** * Get the wl_surface which belongs to this window * * @param window The Ecore_Wl2_Window to get the surface of diff --git a/src/lib/ecore_wl2/ecore_wl2_private.h b/src/lib/ecore_wl2/ecore_wl2_private.h index 2ab1a27..35fdd8a 100644 --- a/src/lib/ecore_wl2/ecore_wl2_private.h +++ b/src/lib/ecore_wl2/ecore_wl2_private.h @@ -250,6 +250,9 @@ struct _Ecore_Wl2_Window unsigned int resource_id; // + void (*cb_close) (void *data, Ecore_Wl2_Window *win); + void *cb_close_data; + Eina_Stringshare *uuid; void (*xdg_configure_ack)(struct xdg_surface *surface, uint32_t serial); diff --git a/src/lib/ecore_wl2/ecore_wl2_window.c b/src/lib/ecore_wl2/ecore_wl2_window.c index ff270b6..c2844de 100644 --- a/src/lib/ecore_wl2/ecore_wl2_window.c +++ b/src/lib/ecore_wl2/ecore_wl2_window.c @@ -356,7 +356,11 @@ _xdg_toplevel_cb_close(void *data, struct xdg_toplevel *xdg_toplevel EINA_UNUSED win = data; if (!win) return; - + if (win->cb_close) + { + win->cb_close(win->cb_close_data, win); + win->cb_close = NULL; + } ecore_wl2_window_free(win); } @@ -1096,6 +1100,14 @@ ecore_wl2_window_id_get(Ecore_Wl2_Window *window) return window->id; } +EAPI void +ecore_wl2_window_close_callback_set(Ecore_Wl2_Window *window, void (*cb) (void *data, Ecore_Wl2_Window *win), void *data) +{ + EINA_SAFETY_ON_NULL_RETURN(window); + window->cb_close = cb; + window->cb_close_data = data; +} + EAPI struct wl_surface * ecore_wl2_window_surface_get(Ecore_Wl2_Window *window) { diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c index 3b98001..f624ecd 100755 --- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c +++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c @@ -1883,7 +1883,12 @@ _ecore_evas_wl_common_free(Ecore_Evas *ee) if (wdata->frame) ecore_wl2_window_frame_callback_del(wdata->frame); wdata->frame = NULL; ecore_event_handler_del(wdata->sync_handler); - if (wdata->win) ecore_wl2_window_free(wdata->win); + if (wdata->win) + { + ecore_wl2_window_close_callback_set(wdata->win, NULL, NULL); + ecore_wl2_window_free(wdata->win); + wdata->win = NULL; + } ecore_wl2_display_disconnect(wdata->display); EINA_LIST_FREE(wdata->devices_list, device) @@ -3388,6 +3393,17 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func = _ecore_evas_wl_common_evas_engine_rsc_free, }; +static void +_ecore_evas_wl_common_win_close(void *data, Ecore_Wl2_Window *win EINA_UNUSED) +{ + Ecore_Evas *ee = data; + Ecore_Evas_Engine_Wl_Data *wdata = ee->engine.data; + + if (ee->func.fn_delete_request) ee->func.fn_delete_request(ee); + + wdata->win = NULL; +} + Ecore_Evas * _ecore_evas_wl_common_new_internal(const char *disp_name, Ecore_Window parent, int x, int y, int w, int h, Eina_Bool frame, const int *opt, const char *engine_name) { @@ -3485,6 +3501,7 @@ _ecore_evas_wl_common_new_internal(const char *disp_name, Ecore_Window parent, i wdata->display = ewd; wdata->win = ecore_wl2_window_new(ewd, p, x, y, w, h); + ecore_wl2_window_close_callback_set(wdata->win, _ecore_evas_wl_common_win_close, ee); ee->prop.window = ecore_wl2_window_id_get(wdata->win); ee->prop.aux_hint.supported_list = ecore_wl2_window_aux_hints_supported_get(wdata->win); ecore_evas_aux_hint_add(ee, "wm.policy.win.msg.use", "1");