e_comp_wl: send cancelled event after dnd drop 26/126926/5
authorMinJeong Kim <minjjj.kim@samsung.com>
Tue, 25 Apr 2017 08:42:04 +0000 (17:42 +0900)
committerMinJeong Kim <minjjj.kim@samsung.com>
Wed, 26 Apr 2017 07:40:53 +0000 (07:40 +0000)
If drag data source was dropped and its all data offer was destroied
send cancelled event for it to notify of the source client for dnd end

Change-Id: Ib0ab170ff4899baea2ca175075fcdfce6d24253f
Signed-off-by: MinJeong Kim <minjjj.kim@samsung.com>
src/bin/e_comp_wl.h
src/bin/e_comp_wl_data.c
src/bin/e_comp_wl_data.h

index d68543b2594a7a08f61e35562a2165bea3c70983..70d721062295b54317cc56b0dc4a010f49c2d134 100644 (file)
@@ -353,6 +353,7 @@ struct _E_Comp_Wl_Data
    E_Drag *drag;
    E_Client *drag_client;
    void *drag_source;
+   void *drag_offer;
 };
 
 struct _E_Comp_Wl_Client_Data
index 2dbbc5c1be033f6df1bcdd796be1768cad681886..4c403fd38729566ad290288660a366d161423e4b 100644 (file)
@@ -1,6 +1,8 @@
 #define EXECUTIVE_MODE_ENABLED
 #include "e.h"
 
+static void _e_comp_wl_data_source_cancelled_send(E_Comp_Wl_Data_Source *source);
+
 static void
 _mime_types_free(E_Comp_Wl_Data_Source *source)
 {
@@ -57,7 +59,14 @@ _e_comp_wl_data_offer_cb_resource_destroy(struct wl_resource *resource)
      return;
 
    if (offer->source)
-     wl_list_remove(&offer->source_destroy_listener.link);
+     {
+        wl_list_remove(&offer->source_destroy_listener.link);
+        if (offer->dropped && offer->source != e_comp_wl->drag_source)
+          _e_comp_wl_data_source_cancelled_send(offer->source);
+     }
+
+   if (offer == e_comp_wl->drag_offer)
+     e_comp_wl->drag_offer = NULL;
 
    free(offer);
 }
@@ -381,6 +390,9 @@ _e_comp_wl_data_device_drag_finished(E_Drag *drag, int dropped)
           }
         e_comp_wl->selection.target = NULL;
         e_comp_wl->drag_source = NULL;
+
+        if (e_comp_wl->drag_offer)
+          ((E_Comp_Wl_Data_Offer*)e_comp_wl->drag_offer)->dropped = EINA_TRUE;
      }
 }
 
@@ -738,7 +750,19 @@ e_comp_wl_data_device_send_enter(E_Client *ec)
            e_comp_wl_data_find_for_client(wl_resource_get_client(ec->comp_data->surface));
         if (!data_device_res) return;
         offer_res = e_comp_wl_data_device_send_offer(ec);
-        if (e_comp_wl->drag_source && (!offer_res)) return;
+        if (e_comp_wl->drag_source)
+          {
+             E_Comp_Wl_Data_Offer *offer;
+
+             if (!offer_res) return;
+
+             if ((e_comp_wl->drag_offer) &&
+                 (e_comp_wl->drag_offer->source == e_comp_wl->drag_source))
+               e_comp_wl->drag_offer->dropped = EINA_FALSE;
+
+             offer = wl_resource_get_user_data(offer_res);
+             e_comp_wl->drag_offer = offer;
+          }
      }
    else
      return;
index 174cb1e4b33718aac28d60f5e4e9567ee8c18698..7b35e5a8fcfa9a3c9b640c90ffbd176e20eca2bd 100644 (file)
@@ -36,6 +36,8 @@ struct _E_Comp_Wl_Data_Offer
 {
    struct wl_resource *resource; //resource of wl_data_offer
 
+   Eina_Bool dropped; //if 1, its data source is already dropped
+
    E_Comp_Wl_Data_Source *source; //indicates source client data
    struct wl_listener source_destroy_listener; //listener for destroy of source
 };