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:
Sebastian Dransfeld 2007-01-03 06:14:04 +00:00
parent 74f9fa0bf6
commit c299f6aa14
9 changed files with 68 additions and 32 deletions

View File

@ -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)
{

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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)
{

View File

@ -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)

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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)
{