summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiep Ha <thiepha@gmail.com>2017-11-09 11:27:07 +0900
committerThiep Ha <thiepha@gmail.com>2017-12-08 11:17:23 +0900
commit76be9b992b367762daac1686b80f8267a3a39033 (patch)
tree968b1ed1d0fa6d56ee258e1f9f8e26f5a497bb7f
parent7a2ad205ac86ea09046452b520b9f88967d3636f (diff)
downloadefl-76be9b992b367762daac1686b80f8267a3a39033.tar.gz
add implementation for drag_action_set, drop_target_del
-rw-r--r--src/lib/elementary/efl_dnd.c8
-rw-r--r--src/lib/elementary/efl_selection_manager.c90
-rw-r--r--src/lib/elementary/efl_selection_manager.eo5
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