e_comp_wl_data: Revert view adaptaion of destroy event listener 31/321031/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 13 Feb 2025 02:40:27 +0000 (11:40 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 13 Mar 2025 06:35:49 +0000 (15:35 +0900)
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

index 4d7aecf00a96552b1ea141e1e809978b6d5735f8..c1c06988328376ed7545ad99e94a5e126bdd634e 100644 (file)
@@ -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;