diff options
author | Thiep Ha <thiepha@gmail.com> | 2017-11-09 11:27:07 +0900 |
---|---|---|
committer | Thiep Ha <thiepha@gmail.com> | 2017-12-08 11:17:23 +0900 |
commit | 76be9b992b367762daac1686b80f8267a3a39033 (patch) | |
tree | 968b1ed1d0fa6d56ee258e1f9f8e26f5a497bb7f | |
parent | 7a2ad205ac86ea09046452b520b9f88967d3636f (diff) | |
download | efl-76be9b992b367762daac1686b80f8267a3a39033.tar.gz |
add implementation for drag_action_set, drop_target_del
-rw-r--r-- | src/lib/elementary/efl_dnd.c | 8 | ||||
-rw-r--r-- | src/lib/elementary/efl_selection_manager.c | 90 | ||||
-rw-r--r-- | src/lib/elementary/efl_selection_manager.eo | 5 |
3 files changed, 94 insertions, 9 deletions
diff --git a/src/lib/elementary/efl_dnd.c b/src/lib/elementary/efl_dnd.c index 271d1f8e1d..ec7bded653 100644 --- a/src/lib/elementary/efl_dnd.c +++ b/src/lib/elementary/efl_dnd.c @@ -52,13 +52,16 @@ EOLIAN static void _efl_ui_dnd_efl_dnd_drag_cancel(Eo *obj, Efl_Ui_Dnd_Data *pd) { ERR("In"); + Eo *sel_man = _selection_manager_get(obj); + efl_selection_manager_drag_cancel(sel_man, obj, NULL); } EOLIAN static void _efl_ui_dnd_efl_dnd_drag_action_set(Eo *obj, Efl_Ui_Dnd_Data *pd , Efl_Selection_Action action) { ERR("In"); - pd->action = action; + Eo *sel_man = _selection_manager_get(obj); + efl_selection_manager_drag_action_set(sel_man, action, NULL); } EOLIAN static void @@ -91,7 +94,8 @@ EOLIAN static void _efl_ui_dnd_efl_dnd_drop_target_del(Eo *obj, Efl_Ui_Dnd_Data *pd, Efl_Selection_Format format) { ERR("In"); - pd->format = format; + Eo *sel_man = _selection_manager_get(obj); + efl_selection_manager_drop_target_del(sel_man, obj, format, NULL); } EOLIAN static void diff --git a/src/lib/elementary/efl_selection_manager.c b/src/lib/elementary/efl_selection_manager.c index 528b0555d0..fd312f9d5d 100644 --- a/src/lib/elementary/efl_selection_manager.c +++ b/src/lib/elementary/efl_selection_manager.c @@ -1070,7 +1070,8 @@ _x11_drag_mouse_up(void *data, int etype EINA_UNUSED, void *event) { Evas_Object *win = elm_widget_top_get(pd->drag_obj); if (win && efl_isa(win, EFL_UI_WIN_CLASS)) - efl_event_callback_del(win, EFL_UI_WIN_EVENT_ROTATION_CHANGED, _x11_win_rotation_changed_cb, pd->drag_win); + efl_event_callback_del(win, EFL_UI_WIN_EVENT_ROTATION_CHANGED, + _x11_win_rotation_changed_cb, pd->drag_win); } } @@ -1287,7 +1288,8 @@ _efl_selection_manager_drag_start(Eo *obj, Efl_Selection_Manager_Data *pd, Efl_O if (win && efl_isa(win, EFL_UI_WIN_CLASS)) { elm_win_rotation_set(pd->drag_win, elm_win_rotation_get(win)); - efl_event_callback_add(win, EFL_UI_WIN_EVENT_ROTATION_CHANGED, _x11_win_rotation_changed_cb, pd->drag_win); + efl_event_callback_add(win, EFL_UI_WIN_EVENT_ROTATION_CHANGED, + _x11_win_rotation_changed_cb, pd->drag_win); } } @@ -1356,16 +1358,45 @@ _efl_selection_manager_drag_start(Eo *obj, Efl_Selection_Manager_Data *pd, Efl_O } EOLIAN static void -_efl_selection_manager_drag_cancel(Eo *obj, Efl_Selection_Manager_Data *pd) +_efl_selection_manager_drag_cancel(Eo *obj, Efl_Selection_Manager_Data *pd, Efl_Object *drag_obj, Efl_Input_Device *seat) { ERR("In"); + +#ifdef HAVE_ELEMENTARY_X + Ecore_X_Window xwin = _x11_xwin_get(drag_obj); + if (xwin) + { + ecore_x_pointer_ungrab(); + ELM_SAFE_FREE(pd->mouse_up_handler, ecore_event_handler_del); + ELM_SAFE_FREE(pd->dnd_status_handler, ecore_event_handler_del); + ecore_x_dnd_abort(xwin); + if (pd->drag_obj) + { + if (elm_widget_is(pd->drag_obj)) + { + Evas_Object *win = elm_widget_top_get(pd->drag_obj); + if (win && efl_isa(win, EFL_UI_WIN_CLASS)) + efl_event_callback_del(win, EFL_UI_WIN_EVENT_ROTATION_CHANGED, + _x11_win_rotation_changed_cb, pd->drag_win); + } + } + pd->drag_obj = NULL; + } +#endif + + ELM_SAFE_FREE(pd->drag_win, evas_object_del); } EOLIAN static void -_efl_selection_manager_drag_action_set(Eo *obj, Efl_Selection_Manager_Data *pd , Efl_Selection_Action action) +_efl_selection_manager_drag_action_set(Eo *obj, Efl_Selection_Manager_Data *pd , Efl_Selection_Action action, Efl_Input_Device *seat) { ERR("In"); - //pd->action = action; + Ecore_X_Atom actx; + + if (pd->drag_action == action) return; + pd->drag_action = action; + actx = _x11_dnd_action_rev_map(action); + ecore_x_dnd_source_action_set(actx); } static void @@ -1376,7 +1407,6 @@ _all_drop_targets_cbs_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Obje dropable = efl_key_data_get(obj, "__elm_dropable"); if (dropable) { -#if 0 Drop_Format *df; while (dropable->format_list) { @@ -1388,7 +1418,6 @@ _all_drop_targets_cbs_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Obje dropable = efl_key_data_get(obj, "__elm_dropable"); if (!dropable) break; } -#endif /*Dropable_Cbs *cbs; while (dropable->cbs_list) { @@ -2112,6 +2141,53 @@ EOLIAN static void _efl_selection_manager_drop_target_del(Eo *obj, Efl_Selection_Manager_Data *pd, Efl_Object *target_obj, Efl_Selection_Format format, Efl_Input_Device *seat) { ERR("In"); + Eina_List *l; + Ecore_X_Window xwin; + Eina_Bool have_drops = EINA_FALSE; + Dropable *dropable = NULL; + + dropable = efl_key_data_get(target_obj, "__elm_dropable"); + if (dropable) + { + Eina_Inlist *itr; + Drop_Format *df; + EINA_INLIST_FOREACH_SAFE(dropable->format_list, itr, df) + { + if (df->format == format) + { + dropable->format_list = eina_inlist_remove(dropable->format_list, + EINA_INLIST_GET(df)); + free(df); + } + } + if (!dropable->format_list) + { + pd->drops = eina_list_remove(pd->drops, dropable); + efl_key_data_set(target_obj, "__elm_dropable", NULL); + free(dropable); + evas_object_event_callback_del(target_obj, EVAS_CALLBACK_DEL, + _all_drop_targets_cbs_del); + } + } + + if (!pd->drops) return; + xwin = _x11_xwin_get(target_obj); + EINA_LIST_FOREACH(pd->drops, l, dropable) + { + if (xwin == _x11_xwin_get(dropable->obj)) + { + have_drops = EINA_TRUE; + break; + } + } + if (!have_drops) ecore_x_dnd_aware_set(xwin, EINA_FALSE); + if (!pd->drops) + { + ELM_SAFE_FREE(pd->pos_handler, ecore_event_handler_del); + ELM_SAFE_FREE(pd->drop_handler, ecore_event_handler_del); + ELM_SAFE_FREE(pd->enter_handler, ecore_event_handler_del); + ELM_SAFE_FREE(pd->leave_handler, ecore_event_handler_del); + } } diff --git a/src/lib/elementary/efl_selection_manager.eo b/src/lib/elementary/efl_selection_manager.eo index d9bd3ac3f5..3e4b2c2c54 100644 --- a/src/lib/elementary/efl_selection_manager.eo +++ b/src/lib/elementary/efl_selection_manager.eo @@ -54,10 +54,15 @@ class Efl.Selection.Manager (Efl.Object, Efl.Selection, Efl.Dnd) { [[This sets the action for the drag]] params { @in action: Efl.Selection.Action; [[Drag action]] + @in seat: Efl.Input.Device @optional; [[Specified seat for multiple seats case.]] } } drag_cancel { [[This cancels the on-going drag]] + params { + @in drag_obj: Efl.Object; [[The drag object]] + @in seat: Efl.Input.Device @optional; [[Specified seat for multiple seats case.]] + } } /*drag_item_container_add { [[This registers a drag for items in a container. Many items can be |