e_comp_wl_data: Use e_view_event_listener 89/320289/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Fri, 21 Feb 2025 08:54:38 +0000 (17:54 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Wed, 26 Feb 2025 07:08:56 +0000 (16:08 +0900)
Revert temp patch to prevent lockup by dnd test.(#1786)
Fix lockup problem and use e_view_event_listener instead evas_object_event_listener.

Change-Id: Ia171e06695bb81e55acef4ae6516f48697af407a

src/bin/server/e_comp_wl_data.c
src/bin/server/e_comp_wl_data_intern.h

index 9f46ed79bab88ad0e2c719b6290cb2a0a381d8af..c3baa63fd613831a6f8ae213ac65c3b1e107b74d 100644 (file)
@@ -1337,14 +1337,38 @@ _e_comp_wl_clipboard_create(E_Comp_Wl_Data *comp_wl)
 }
 
 static void
-_e_comp_wl_data_device_target_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+_e_comp_wl_data_offer_destory_listener_remove(E_Comp_Wl_Data_Offer *offer)
 {
-   E_Client *ec = data;
+   if (!offer) return;
+   if (!offer->drag_enter) return;
+
+   wl_list_remove(&offer->ec_destroy_listener.link);
+   offer->drag_enter = EINA_FALSE;
+}
+
+static void
+_e_comp_wl_data_device_target_del(struct wl_listener *listener, void *data)
+{
+   E_Comp_Wl_Data_Offer *offer = wl_container_of(listener, offer, ec_destroy_listener);
+   E_Client *ec = offer->ec;
    E_Comp_Wl_Data *comp_wl;
 
    comp_wl = e_comp_wl_get();
    if (comp_wl->selection.target == ec)
      comp_wl->selection.target = NULL;
+
+   if (comp_wl->drag_offer)
+     {
+        offer = (E_Comp_Wl_Data_Offer *)comp_wl->drag_offer;
+        _e_comp_wl_data_offer_destory_listener_remove(offer);
+     }
+}
+
+Eina_Bool
+_e_comp_wl_data_ec_valid(E_Client *ec)
+{
+   E_OBJECT_CHECK_RETURN(ec, EINA_FALSE);
+   return EINA_TRUE;
 }
 
 EINTERN void
@@ -1358,7 +1382,6 @@ e_comp_wl_data_device_send_enter(E_Client *ec)
    E_Comp_Wl_Data *comp_wl;
    E_Comp_Wl_Data_Source *drag_source;
 
-
    struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
    if (!surface) return;
 
@@ -1380,6 +1403,9 @@ e_comp_wl_data_device_send_enter(E_Client *ec)
         old_offer->dropped = EINA_FALSE;
         old_offer->source = NULL;
         _e_comp_wl_data_offer_source_destroy_listener_del(old_offer);
+
+        if (_e_comp_wl_data_ec_valid(old_offer->ec))
+          _e_comp_wl_data_offer_destory_listener_remove(old_offer);
      }
    drag_source->accepted = EINA_FALSE;
 
@@ -1392,7 +1418,11 @@ e_comp_wl_data_device_send_enter(E_Client *ec)
 
    comp_wl->selection.target = ec;
 
-   evas_object_event_callback_add(ec->frame, EVAS_CALLBACK_DEL, _e_comp_wl_data_device_target_del, 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;
+   offer->ec = ec;
 
    if (e_client_transform_core_enable_get(ec))
      {
@@ -1424,10 +1454,16 @@ e_comp_wl_data_device_send_leave(E_Client *ec)
    E_Comp_Config *comp_conf;
    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);
+   E_Comp_Wl_Data_Offer *offer;
 
    comp_wl = e_comp_wl_get();
+
+   if (comp_wl->drag_offer)
+     {
+        offer = (E_Comp_Wl_Data_Offer *)comp_wl->drag_offer;
+        _e_comp_wl_data_offer_destory_listener_remove(offer);
+     }
+
    if (comp_wl->selection.target == ec)
      comp_wl->selection.target = NULL;
    struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
index 8aff4045b9b79c5cb07028f3747eeae99aa33be5..4ea9ec6a53e83a9ffdf4d94fcfc00ac35db86258 100644 (file)
@@ -54,6 +54,7 @@ struct _E_Comp_Wl_Data_Offer
 
    Eina_Bool drag_enter;
    struct wl_listener ec_destroy_listener; //listener for destroy of ec
+   E_Client *ec;
 };
 
 struct _E_Comp_Wl_Clipboard_Source