diff options
author | Marcel Hollerbach <mail@marcel-hollerbach.de> | 2020-04-12 11:58:36 +0200 |
---|---|---|
committer | Marcel Hollerbach <mail@marcel-hollerbach.de> | 2020-04-14 11:55:41 +0200 |
commit | be7ffe11420273e6f5e29d428be22e17d95064a6 (patch) | |
tree | 003ee56a98e4da3c15ef9244adb2fc03eeeb583a | |
parent | 5551a39d68f7eeafd020a4777db37ce408226bae (diff) | |
download | efl-be7ffe11420273e6f5e29d428be22e17d95064a6.tar.gz |
elm_dnd: support target setting on none evas_objects
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.
Differential Revision: https://phab.enlightenment.org/D11698
-rw-r--r-- | src/lib/elementary/efl_ui_win.c | 32 | ||||
-rw-r--r-- | src/lib/elementary/elm_dnd.c | 22 |
2 files changed, 42 insertions, 12 deletions
diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index 51806d15d5..7a58ddfc81 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -9398,12 +9398,29 @@ _remove(void *data, void *gdata) return EINA_TRUE; } +static Efl_Ui_Win_Data* +_fetch_win_data_from_arbitary_obj(Efl_Canvas_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); + 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 +9429,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 +9450,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 +9458,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 243c1b8ce9..3dcc02b3ec 100644 --- a/src/lib/elementary/elm_dnd.c +++ b/src/lib/elementary/elm_dnd.c @@ -97,13 +97,30 @@ _deliver_content(Eo *obj, void *data, const Eina_Value value) return EINA_VALUE_EMPTY; } + +static Efl_Ui_Win* +_fetch_win(Efl_Canvas_Object *obj) +{ + Efl_Ui_Win *win = efl_provider_find(obj, EFL_UI_WIN_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 void _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 : _fetch_win(ev->object), _default_seat(ev->object), eina_array_iterator_new(target->mime_types)), .success = _deliver_content, .data = target ); @@ -182,7 +199,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); @@ -227,6 +244,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); } |