static void _e_int_menus_apps_drag(void *data, E_Menu *m, E_Menu_Item *mi) { E_Border *bd; bd = data; /* start drag! */ if (mi->icon_object) { E_Drag *drag; Evas_Object *o = NULL; Evas_Coord x, y, w, h; const char *drag_types[] = { "enlightenment/border" }; evas_object_geometry_get(mi->icon_object, &x, &y, &w, &h); drag = e_drag_new(m->zone->container, x, y, drag_types, 1, bd, -1, NULL, _itask_menu_cb_item_drag_finished); o = e_border_icon_add(bd, e_drag_evas_get(drag)); e_drag_object_set(drag, o); e_drag_resize(drag, w, h); e_object_ref(E_OBJECT(bd)); e_drag_start(drag, mi->drag.x + w, mi->drag.y + h); } }
static void _itask_item_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info) { Evas_Event_Mouse_Move *ev; Itask_Item *ic; int dx, dy; ev = event_info; ic = data; if (!ic->drag.start) return; dx = ev->cur.output.x - ic->drag.x; dy = ev->cur.output.y - ic->drag.y; if (((dx * dx) + (dy * dy)) > (e_config->drag_resist * e_config->drag_resist)) { E_Drag *d; Evas_Object *o; Evas_Coord x, y, w, h; const char *drag_types[] = { "enlightenment/border" }; ic->drag.dnd = 1; ic->drag.start = 0; evas_object_geometry_get(ic->o_icon, &x, &y, &w, &h); d = e_drag_new(ic->itask->gcc->gadcon->zone->container, x, y, drag_types, 1, ic->border, -1, NULL, _itask_item_cb_drag_finished); o = e_border_icon_add(ic->border, e_drag_evas_get(d)); e_drag_object_set(d, o); e_drag_resize(d, w, h); e_drag_start(d, ic->drag.x, ic->drag.y); evas_event_feed_mouse_up(ic->itask->gcc->gadcon->evas, 1, EVAS_BUTTON_NONE, ecore_x_current_time_get(), NULL); e_object_ref(E_OBJECT(ic->border)); } }
E_API int e_drag_start(E_Drag *drag, int x, int y) { const Eina_List *l; E_Drop_Handler *h; if (_drag_win) return 0; #ifndef HAVE_WAYLAND_ONLY if (e_comp->comp_type == E_PIXMAP_TYPE_X) { _drag_win = ecore_x_window_input_new(e_comp->win, 0, 0, e_comp->w, e_comp->h); ecore_event_window_register(_drag_win, e_comp->ee, e_comp->evas, NULL, NULL, NULL, NULL); ecore_x_window_show(_drag_win); _drag_win_root = e_comp->root; if (!e_grabinput_get(_drag_win, 0, _drag_win)) { ecore_x_window_free(_drag_win); _drag_win = _drag_win_root = 0; return 0; } } else #endif { _drag_win = _drag_win_root = e_comp->ee_win; if (!e_comp_grab_input(1, 1)) { _drag_win = _drag_win_root = 0; return 0; } } if (!drag->object) { e_drag_object_set(drag, evas_object_rectangle_add(drag->evas)); evas_object_color_set(drag->object, 255, 0, 0, 255); } evas_object_move(drag->comp_object, drag->x, drag->y); evas_object_resize(drag->comp_object, drag->w, drag->h); drag->visible = 1; drag->type = E_DRAG_INTERNAL; drag->dx = x - drag->x; drag->dy = y - drag->y; _active_handlers = eina_list_free(_active_handlers); EINA_LIST_FOREACH(_drop_handlers, l, h) { Eina_Bool active = h->active; h->active = 0; eina_stringshare_replace(&h->active_type, NULL); _e_drop_handler_active_check(h, drag, NULL); if (h->active != active) { if (h->active) _active_handlers = eina_list_append(_active_handlers, h); else _active_handlers = eina_list_remove(_active_handlers, h); } h->entered = 0; }