zmike pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=f2ed538d41c8ce8b25430dd209770e6dc1b133af

commit f2ed538d41c8ce8b25430dd209770e6dc1b133af
Author: Marcel Hollerbach <[email protected]>
Date:   Tue Apr 14 11:29:39 2020 -0400

    elm_dnd: support target setting on none evas_objects
    
    Summary:
    before this only worked for elm widgets. This however is the same
    behaviour as in efl_ui_selection_manager.c. So this restores the
    behaviour prior to selection_manager.
    
    Depends on D11697
    
    Reviewers: zmike, stefan_schmidt, raster
    
    Reviewed By: zmike
    
    Subscribers: cedric, #reviewers, #committers
    
    Tags: #efl
    
    Differential Revision: https://phab.enlightenment.org/D11698
---
 src/lib/elementary/efl_ui_win.c | 40 ++++++++++++++++++++++++++++++----------
 src/lib/elementary/elm_dnd.c    |  5 +++--
 src/lib/elementary/elm_priv.h   |  1 +
 3 files changed, 34 insertions(+), 12 deletions(-)

diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c
index 51806d15d5..0f5bbdbc25 100644
--- a/src/lib/elementary/efl_ui_win.c
+++ b/src/lib/elementary/efl_ui_win.c
@@ -9398,12 +9398,37 @@ _remove(void *data, void *gdata)
    return EINA_TRUE;
 }
 
+Efl_Ui_Win*
+efl_ui_win_get(Evas_Object *obj)
+{
+   Efl_Ui_Win *win = efl_provider_find(obj, MY_CLASS);
+   if (!win)
+     {
+        Evas *e = evas_object_evas_get(obj);
+        Ecore_Evas *ee = ecore_evas_ecore_evas_get(e);
+
+        win = ecore_evas_data_get(ee, "elm_win");
+     }
+   EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
+   return win;
+}
+
+static Efl_Ui_Win_Data*
+_fetch_win_data_from_arbitary_obj(Efl_Canvas_Object *obj)
+{
+   Efl_Ui_Win *win = efl_ui_win_get(obj);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(win, NULL);
+   Efl_Ui_Win_Data *pd = efl_data_scope_safe_get(win, MY_CLASS);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(pd, NULL);
+   return pd;
+}
+
 void
 _drop_event_register(Eo *obj)
 {
    Ui_Dnd_Target target = {obj, EINA_FALSE};
-   Efl_Ui_Win_Data *pd = efl_data_scope_safe_get(efl_provider_find(obj, 
MY_CLASS), MY_CLASS);
-   EINA_SAFETY_ON_NULL_RETURN(pd);
+   Efl_Ui_Win_Data *pd = _fetch_win_data_from_arbitary_obj(obj);
+   if (!pd) return;
 
    eina_inarray_push(pd->drop_target, &target);
 }
@@ -9412,9 +9437,8 @@ void
 _drop_event_unregister(Eo *obj)
 {
    int idx = -1;
-   Efl_Ui_Win_Data *pd;
 
-   pd = efl_data_scope_safe_get(efl_provider_find(obj, MY_CLASS), MY_CLASS);
+   Efl_Ui_Win_Data *pd = _fetch_win_data_from_arbitary_obj(obj);
    if (!pd) return;
 
    for (unsigned int i = 0; i < eina_inarray_count(pd->drop_target); ++i)
@@ -9434,9 +9458,7 @@ _drop_event_unregister(Eo *obj)
 void
 _selection_changed_event_register(Eo *obj)
 {
-   Efl_Ui_Win_Data *pd;
-
-   pd = efl_data_scope_safe_get(efl_provider_find(obj, MY_CLASS), MY_CLASS);
+   Efl_Ui_Win_Data *pd = _fetch_win_data_from_arbitary_obj(obj);
    if (!pd) return;
 
    eina_array_push(pd->selection_changed, obj);
@@ -9444,9 +9466,7 @@ _selection_changed_event_register(Eo *obj)
 void
 _selection_changed_event_unregister(Eo *obj)
 {
-   Efl_Ui_Win_Data *pd;
-
-   pd = efl_data_scope_safe_get(efl_provider_find(obj, MY_CLASS), MY_CLASS);
+   Efl_Ui_Win_Data *pd = _fetch_win_data_from_arbitary_obj(obj);
    if (!pd) return;
 
    eina_array_remove(pd->selection_changed, _remove, obj);
diff --git a/src/lib/elementary/elm_dnd.c b/src/lib/elementary/elm_dnd.c
index bc765fdbb6..891fe4da92 100644
--- a/src/lib/elementary/elm_dnd.c
+++ b/src/lib/elementary/elm_dnd.c
@@ -103,7 +103,7 @@ _drop_cb(void *data, const Efl_Event *ev)
    Efl_Ui_Drop_Dropped_Event *event = ev->info;
    Elm_Drop_Target *target = data;
    target->action = _string_to_action(event->action);
-   efl_future_then(ev->object, efl_ui_dnd_drop_data_get(ev->object, 
_default_seat(ev->object), eina_array_iterator_new(target->mime_types)),
+   efl_future_then(ev->object, 
efl_ui_dnd_drop_data_get(elm_widget_is(ev->object) ? ev->object : 
efl_ui_win_get(ev->object), _default_seat(ev->object), 
eina_array_iterator_new(target->mime_types)),
     .success = _deliver_content,
     .data = target
    );
@@ -178,7 +178,7 @@ elm_drop_target_add(Evas_Object *obj, Elm_Sel_Format format,
    target->format = format;
 
    efl_event_callback_array_add(obj, drop_target_cb(), target);
-
+   _drop_event_register(obj); //this is ensuring that we are also supporting 
none widgets
    if (!target_register)
      target_register = eina_hash_pointer_new(NULL);
    eina_hash_list_append(target_register, &obj, target);
@@ -223,6 +223,7 @@ elm_drop_target_del(Evas_Object *obj, Elm_Sel_Format format,
         efl_event_callback_array_del(obj, drop_target_cb(), 
eina_list_data_get(found));
         eina_hash_list_remove(target_register, &obj, target);
         eina_array_free(target->mime_types);
+        _drop_event_unregister(obj); //this is ensuring that we are also 
supporting none widgets
         free(target);
      }
 
diff --git a/src/lib/elementary/elm_priv.h b/src/lib/elementary/elm_priv.h
index 8cfc7c952a..5f3efd8bb5 100644
--- a/src/lib/elementary/elm_priv.h
+++ b/src/lib/elementary/elm_priv.h
@@ -1061,5 +1061,6 @@ void _selection_changed_event_unregister(Eo *obj);
 void _drop_event_register(Eo *obj);
 void _drop_event_unregister(Eo *obj);
 void _register_selection_changed(Efl_Ui_Selection *selection);
+Efl_Ui_Win* efl_ui_win_get(Evas_Object *obj);
 
 #endif

-- 


Reply via email to