From 3a3261c46e9b94e6002d81d51fef202c7d9f9865 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Thu, 13 Feb 2025 11:40:27 +0900 Subject: [PATCH] e_comp_wl_data: Revert view adaptaion of destroy event listener The previous patch cannot execute event del about destroy. It can makes double free problem when execute dnd. Change-Id: I9e8b35a01836557a92483971d129072cef822d2b --- src/bin/server/e_comp_wl_data.c | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/bin/server/e_comp_wl_data.c b/src/bin/server/e_comp_wl_data.c index 4d7aecf00a..c1c0698832 100644 --- a/src/bin/server/e_comp_wl_data.c +++ b/src/bin/server/e_comp_wl_data.c @@ -395,9 +395,6 @@ _e_comp_wl_data_offer_cb_resource_destroy(struct wl_resource *resource) if (!(offer = wl_resource_get_user_data(resource))) return; - if (offer->drag_enter) - wl_list_remove(&offer->ec_destroy_listener.link); - comp_wl = e_comp_wl_get(); _e_comp_wl_data_offer_fd_handler_del(offer); @@ -1330,7 +1327,7 @@ _e_comp_wl_clipboard_create(E_Comp_Wl_Data *comp_wl) } static void -_e_comp_wl_data_device_target_del(struct wl_listener *listener, void *data) +_e_comp_wl_data_device_target_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { E_Client *ec = data; E_Comp_Wl_Data *comp_wl; @@ -1384,10 +1381,8 @@ e_comp_wl_data_device_send_enter(E_Client *ec) wl_data_offer_send_source_actions(offer_res, offer->source->dnd_actions); comp_wl->selection.target = ec; - offer = wl_resource_get_user_data(offer_res); - offer->ec_destroy_listener.notify = _e_comp_wl_data_device_target_del; - e_view_event_listener_add(e_view_client_view_get(e_client_view_get(ec)), E_VIEW_DESTROY, &offer->ec_destroy_listener); - offer->drag_enter = EINA_TRUE; + + evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_DEL, _e_comp_wl_data_device_target_del, ec); if (e_client_transform_core_enable_get(ec)) { @@ -1420,6 +1415,8 @@ e_comp_wl_data_device_send_leave(E_Client *ec) struct wl_resource *res; E_Comp_Wl_Data *comp_wl; + evas_object_event_callback_del_full(ec->frame, EVAS_CALLBACK_DEL, _e_comp_wl_data_device_target_del, ec); + comp_wl = e_comp_wl_get(); if (comp_wl->selection.target == ec) comp_wl->selection.target = NULL; -- 2.34.1