}
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
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;
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;
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))
{
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);