e_comp_wl_data: Use e_view_event_listener 32/321032/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Fri, 21 Feb 2025 08:54:38 +0000 (17:54 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 13 Mar 2025 06:36:27 +0000 (15:36 +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 c1c06988328376ed7545ad99e94a5e126bdd634e..880e859654bac4aa49b1023a3d7c2f5c141b0d9c 100644 (file)
@@ -1327,14 +1327,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
@@ -1348,7 +1372,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;
 
@@ -1370,6 +1393,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;
 
@@ -1382,7 +1408,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))
      {
@@ -1414,10 +1444,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 ac70cc4c4cb2854fbd121b3354f2a80ae06a994b..f4626101cc75f280b9ad5bfb124d82540866b9f8 100644 (file)
@@ -57,6 +57,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