diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 48e720123..70fe5dfd9 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -4705,7 +4705,7 @@ _e_border_cb_mouse_move(void *data, int type, void *event) drag = e_drag_new(bd->zone->container, bd->x + bd->fx.x + x, bd->y + bd->fx.y + y, - drag_types, 1, bd, -1, NULL); + drag_types, 1, bd, -1, NULL, NULL); o = e_border_icon_add(bd, drag->evas); if (!o) { diff --git a/src/bin/e_dnd.c b/src/bin/e_dnd.c index b3788db94..d171e0719 100644 --- a/src/bin/e_dnd.c +++ b/src/bin/e_dnd.c @@ -19,7 +19,7 @@ static void _e_drag_show(E_Drag *drag); static void _e_drag_hide(E_Drag *drag); static void _e_drag_move(E_Drag *drag, int x, int y); static void _e_drag_coords_update(E_Drop_Handler *h, int *dx, int *dy, int *dw, int *dh); -static int _e_drag_win_matches(E_Drop_Handler *h, Ecore_X_Window win); +static int _e_drag_win_matches(E_Drop_Handler *h, Ecore_X_Window win); static void _e_drag_update(int x, int y); static void _e_drag_end(int x, int y); static void _e_drag_xdnd_end(int x, int y); @@ -141,6 +141,7 @@ EAPI E_Drag* e_drag_new(E_Container *container, int x, int y, const char **types, unsigned int num_types, void *data, int size, + void *(*convert_cb)(E_Drag *drag, const char *type), void (*finished_cb)(E_Drag *drag, int dropped)) { E_Drag *drag; @@ -194,6 +195,7 @@ e_drag_new(E_Container *container, int x, int y, drag->num_types = num_types; drag->data = data; drag->data_size = size; + drag->cb.convert = convert_cb; drag->cb.finished = finished_cb; _drag_list = evas_list_append(_drag_list, drag); @@ -246,7 +248,6 @@ EAPI int e_drag_start(E_Drag *drag, int x, int y) { Evas_List *l; - int i; if (_drag_win) return 0; _drag_win = ecore_x_window_input_new(drag->container->win, @@ -267,14 +268,24 @@ e_drag_start(E_Drag *drag, int x, int y) for (l = _drop_handlers; l; l = l->next) { E_Drop_Handler *h; + int i, j; h = l->data; h->active = 0; + h->type = NULL; for (i = 0; i < h->num_types; i++) { - if (!strcmp(h->types[i], drag->types[0])) - h->active = 1; + for (j = 0; j < drag->num_types; j++) + { + if (!strcmp(h->types[i], drag->types[j])) + { + h->active = 1; + h->type = h->types[i]; + break; + } + } + if (h->active) break; } h->entered = 0; } @@ -621,18 +632,18 @@ _e_drag_update(int x, int y) if (!h->entered) { if (h->cb.enter) - h->cb.enter(h->cb.data, _drag_current->types[0], &enter_ev); + h->cb.enter(h->cb.data, h->type, &enter_ev); h->entered = 1; } if (h->cb.move) - h->cb.move(h->cb.data, _drag_current->types[0], &move_ev); + h->cb.move(h->cb.data, h->type, &move_ev); } else { if (h->entered) { if (h->cb.leave) - h->cb.leave(h->cb.data, _drag_current->types[0], &leave_ev); + h->cb.leave(h->cb.data, h->type, &leave_ev); h->entered = 0; } } @@ -659,18 +670,18 @@ _e_drag_update(int x, int y) if (!h->entered) { if (h->cb.enter) - h->cb.enter(h->cb.data, _xdnd->type, &enter_ev); + h->cb.enter(h->cb.data, h->type, &enter_ev); h->entered = 1; } if (h->cb.move) - h->cb.move(h->cb.data, _xdnd->type, &move_ev); + h->cb.move(h->cb.data, h->type, &move_ev); } else { if (h->entered) { if (h->cb.leave) - h->cb.leave(h->cb.data, _xdnd->type, &leave_ev); + h->cb.leave(h->cb.data, h->type, &leave_ev); h->entered = 0; } } @@ -684,7 +695,6 @@ _e_drag_end(int x, int y) E_Zone *zone; Evas_List *l; E_Event_Dnd_Drop ev; - const char *type = NULL; int dx, dy, dw, dh; Ecore_X_Window win, ignore_win[2]; @@ -715,9 +725,7 @@ _e_drag_end(int x, int y) ecore_x_window_del(_drag_win); _drag_win = 0; - ev.data = _drag_current->data; - type = _drag_current->types[0]; - if (ev.data) + if (_drag_current->data) { int dropped; @@ -735,7 +743,14 @@ _e_drag_end(int x, int y) ((h->cb.drop) && (E_INSIDE(x, y, dx, dy, dw, dh)))) { - h->cb.drop(h->cb.data, type, &ev); + if (_drag_current->cb.convert) + { + ev.data = _drag_current->cb.convert(_drag_current, + h->type); + } + else + ev.data = _drag_current->data; + h->cb.drop(h->cb.data, h->type, &ev); dropped = 1; } } @@ -765,7 +780,7 @@ _e_drag_end(int x, int y) if (h->entered) { if (h->cb.leave) - h->cb.leave(h->cb.data, type, &leave_ev); + h->cb.leave(h->cb.data, h->type, &leave_ev); h->entered = 0; } } @@ -777,7 +792,6 @@ _e_drag_xdnd_end(int x, int y) { Evas_List *l; E_Event_Dnd_Drop ev; - const char *type = NULL; int dx, dy, dw, dh; Ecore_X_Window win, ignore_win[2]; @@ -793,7 +807,6 @@ _e_drag_xdnd_end(int x, int y) win = ecore_x_window_at_xy_with_skip_get(x, y, NULL, 0); ev.data = _xdnd->data; - type = _xdnd->type; if (ev.data) { @@ -813,7 +826,7 @@ _e_drag_xdnd_end(int x, int y) ((h->cb.drop) && (E_INSIDE(x, y, dx, dy, dw, dh)))) { - h->cb.drop(h->cb.data, type, &ev); + h->cb.drop(h->cb.data, h->type, &ev); dropped = 1; } } @@ -839,7 +852,7 @@ _e_drag_xdnd_end(int x, int y) if (h->entered) { if (h->cb.leave) - h->cb.leave(h->cb.data, type, &leave_ev); + h->cb.leave(h->cb.data, h->type, &leave_ev); h->entered = 0; } } @@ -929,6 +942,7 @@ _e_dnd_cb_event_dnd_enter(void *data, int type, void *event) h = l->data; h->active = 0; + h->type = NULL; h->entered = 0; } for (i = 0; i < ev->num_types; i++) @@ -945,10 +959,15 @@ _e_dnd_cb_event_dnd_enter(void *data, int type, void *event) h = l->data; h->active = 0; + h->type = NULL; for (j = 0; j < h->num_types; j++) { if (!strcmp(h->types[j], _xdnd->type)) - h->active = 1; + { + h->active = 1; + h->type = _xdnd->type; + break; + } } h->entered = 0; @@ -1010,7 +1029,7 @@ _e_dnd_cb_event_dnd_leave(void *data, int type, void *event) if (h->entered) { if (h->cb.leave) - h->cb.leave(h->cb.data, _xdnd->type, leave_ev); + h->cb.leave(h->cb.data, h->type, leave_ev); h->entered = 0; } } diff --git a/src/bin/e_dnd.h b/src/bin/e_dnd.h index 50cb8a1d3..a42d1219d 100644 --- a/src/bin/e_dnd.h +++ b/src/bin/e_dnd.h @@ -36,7 +36,8 @@ struct _E_Drag E_Drag_Type type; struct { - void (*finished)(E_Drag *drag, int dropped); + void *(*convert)(E_Drag *drag, const char *type); + void (*finished)(E_Drag *drag, int dropped); } cb; E_Container *container; @@ -70,6 +71,7 @@ struct _E_Drop_Handler E_Object *obj; char **types; unsigned int num_types; + const char *type; int x, y, w, h; unsigned char active : 1; @@ -106,6 +108,7 @@ EAPI int e_dnd_active(void); EAPI E_Drag *e_drag_new(E_Container *container, int x, int y, const char **types, unsigned int num_types, void *data, int size, + void *(*convert_cb)(E_Drag *drag, const char *type), void (*finished_cb)(E_Drag *drag, int dropped)); EAPI Evas *e_drag_evas_get(E_Drag *drag); EAPI void e_drag_object_set(E_Drag *drag, Evas_Object *object); diff --git a/src/bin/e_fm.c b/src/bin/e_fm.c index e6504f7b1..48cea0e11 100644 --- a/src/bin/e_fm.c +++ b/src/bin/e_fm.c @@ -3518,7 +3518,7 @@ _e_fm2_cb_icon_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_inf evas_list_free(sl); d = e_drag_new(con, x, y, drag_types, 1, - fsel, -1, _e_fm2_cb_drag_finished); + fsel, -1, NULL, _e_fm2_cb_drag_finished); o = edje_object_add(e_drag_evas_get(d)); if (ic->sd->config->view.mode == E_FM2_VIEW_MODE_LIST) { diff --git a/src/bin/e_gadcon.c b/src/bin/e_gadcon.c index 12b1f57bf..d8cbce748 100644 --- a/src/bin/e_gadcon.c +++ b/src/bin/e_gadcon.c @@ -1723,7 +1723,7 @@ _e_gadcon_cb_signal_move_go(void *data, Evas_Object *obj, const char *emission, e_object_ref(E_OBJECT(gcc)); drag = e_drag_new(gcc->gadcon->zone->container, gcc->drag.x, gcc->drag.y, - drag_types, 1, gcc, -1, _e_gadcon_cb_drag_finished); + drag_types, 1, gcc, -1, NULL, _e_gadcon_cb_drag_finished); o = gcc->client_class->func.icon(drag->evas); evas_object_geometry_get(o, NULL, NULL, &w, &h); if (!o) diff --git a/src/bin/e_int_menus.c b/src/bin/e_int_menus.c index 6d2fbd5a8..b9af9e9c6 100644 --- a/src/bin/e_int_menus.c +++ b/src/bin/e_int_menus.c @@ -639,7 +639,8 @@ _e_int_menus_apps_drag(void *data, E_Menu *m, E_Menu_Item *mi) evas_object_geometry_get(mi->icon_object, &x, &y, &w, &h); drag = e_drag_new(m->zone->container, x, y, - drag_types, 1, a, -1, _e_int_menus_apps_drag_finished); + drag_types, 1, a, -1, + NULL, _e_int_menus_apps_drag_finished); o = e_app_icon_add(a, e_drag_evas_get(drag)); e_drag_object_set(drag, o); diff --git a/src/modules/ibar/e_mod_main.c b/src/modules/ibar/e_mod_main.c index 97387502c..217a893d5 100644 --- a/src/modules/ibar/e_mod_main.c +++ b/src/modules/ibar/e_mod_main.c @@ -989,7 +989,7 @@ _ibar_cb_icon_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info evas_object_geometry_get(ic->o_icon, &x, &y, &w, &h); d = e_drag_new(ic->ibar->inst->gcc->gadcon->zone->container, x, y, drag_types, 1, - ic->app, -1, _ibar_cb_drag_finished); + ic->app, -1, NULL, _ibar_cb_drag_finished); o = e_app_icon_add(ic->app, e_drag_evas_get(d)); e_drag_object_set(d, o); diff --git a/src/modules/ibox/e_mod_main.c b/src/modules/ibox/e_mod_main.c index 3e842e5c6..c5d7d89f0 100644 --- a/src/modules/ibox/e_mod_main.c +++ b/src/modules/ibox/e_mod_main.c @@ -752,7 +752,7 @@ _ibox_cb_icon_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info evas_object_geometry_get(ic->o_icon, &x, &y, &w, &h); d = e_drag_new(ic->ibox->inst->gcc->gadcon->zone->container, x, y, drag_types, 1, - ic->border, -1, _ibox_cb_drag_finished); + ic->border, -1, NULL, _ibox_cb_drag_finished); o = e_border_icon_add(ic->border, e_drag_evas_get(d)); e_drag_object_set(d, o); diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c index 57cb850e7..2f0a91420 100644 --- a/src/modules/pager/e_mod_main.c +++ b/src/modules/pager/e_mod_main.c @@ -121,6 +121,7 @@ static void _pager_window_cb_mouse_out(void *data, Evas *e, Evas_Object *obj, vo static void _pager_window_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _pager_window_cb_mouse_up(void *data, Evas *e, Evas_Object *obj, void *event_info); static void _pager_window_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void *_pager_window_cb_drag_convert(E_Drag *drag, const char *type); static void _pager_window_cb_drag_finished(E_Drag *drag, int dropped); static void _pager_inst_cb_enter(void *data, const char *type, void *event_info); static void _pager_inst_cb_move(void *data, const char *type, void *event_info); @@ -162,7 +163,7 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) E_Gadcon_Client *gcc; Instance *inst; Evas_Coord x, y, w, h; - const char *drop[] = { "enlightenment/border", "enlightenment/pager_win" }; + const char *drop[] = { "enlightenment/pager_win", "enlightenment/border" }; inst = E_NEW(Instance, 1); @@ -1422,13 +1423,14 @@ _pager_window_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_i Evas_Object *o, *oo; Evas_Coord x, y, w, h; const char *file = NULL, *part = NULL; - const char *drag_types[] = { "enlightenment/pager_win" }; + const char *drag_types[] = { "enlightenment/pager_win", "enlightenment/border" }; evas_object_geometry_get(pw->o_window, &x, &y, &w, &h); evas_object_hide(pw->o_window); drag = e_drag_new(pw->desk->pager->inst->gcc->gadcon->zone->container, - x, y, drag_types, 1, pw, -1, + x, y, drag_types, 2, pw, -1, + _pager_window_cb_drag_convert, _pager_window_cb_drag_finished); o = edje_object_add(drag->evas); @@ -1457,6 +1459,17 @@ _pager_window_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_i } } +static void * +_pager_window_cb_drag_convert(E_Drag *drag, const char *type) +{ + Pager_Win *pw; + + pw = drag->data; + if (!strcmp(type, "enlightenment/pager_win")) return pw; + if (!strcmp(type, "enlightenment/border")) return pw->border; + return NULL; +} + static void _pager_window_cb_drag_finished(E_Drag *drag, int dropped) {