forked from enlightenment/enlightenment
Add a convert callback so that a drag can have several types.
Make it possible to drag pager windows to the ibar. SVN revision: 27751
This commit is contained in:
parent
74f9fa0bf6
commit
c299f6aa14
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue