SVN revision: 14598
This commit is contained in:
sebastid 2005-05-04 12:16:16 +00:00 committed by sebastid
parent 0e1a615b84
commit 1022489211
4 changed files with 164 additions and 106 deletions

View File

@ -109,6 +109,7 @@ static void _e_border_reorder_after(E_Border *bd, E_Border *after);
static void _e_border_reorder_before(E_Border *bd, E_Border *before);
static int _e_border_cb_focus_fix(void *data);
static void _e_border_cb_finished(E_Drag *drag, int dropped);
/* local subsystem globals */
static Evas_List *handlers = NULL;
@ -2454,9 +2455,17 @@ _e_border_cb_mouse_move(void *data, int type, void *event)
bd->client.icccm.class);
if (a)
{
e_drag_start(bd->zone->container,
"enlightenment/border", bd, NULL,
a->path, "icon");
E_Drag *drag;
Evas_Coord w, h;
drag = e_drag_new(bd->zone->container,
"enlightenment/border", bd,
_e_border_cb_finished,
a->path, "icon");
edje_object_part_geometry_get(bd->bg_object, "icon",
NULL, NULL, &w, &h);
e_drag_resize(drag, w, h);
e_drag_start(drag);
evas_event_feed_mouse_up(bd->bg_evas, 1,
EVAS_BUTTON_NONE, NULL);
}
@ -3590,16 +3599,16 @@ _e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key)
e_menu_item_label_set(mi, _("Close"));
e_menu_item_callback_set(mi, _e_border_menu_cb_close, bd);
e_menu_item_icon_edje_set(mi,
e_theme_edje_file_get("base/theme/borders",
"widgets/border/default/close"),
(char *)e_theme_edje_file_get("base/theme/borders",
"widgets/border/default/close"),
"widgets/border/default/close");
mi = e_menu_item_new(m);
e_menu_item_label_set(mi, _("Iconify"));
e_menu_item_callback_set(mi, _e_border_menu_cb_iconify, bd);
e_menu_item_icon_edje_set(mi,
e_theme_edje_file_get("base/theme/borders",
"widgets/border/default/minimize"),
(char *)e_theme_edje_file_get("base/theme/borders",
"widgets/border/default/minimize"),
"widgets/border/default/minimize");
mi = e_menu_item_new(m);
@ -3611,8 +3620,8 @@ _e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key)
e_menu_item_toggle_set(mi, (bd->shaded ? 1 : 0));
e_menu_item_callback_set(mi, _e_border_menu_cb_shade, bd);
e_menu_item_icon_edje_set(mi,
e_theme_edje_file_get("base/theme/borders",
"widgets/border/default/shade"),
(char *)e_theme_edje_file_get("base/theme/borders",
"widgets/border/default/shade"),
"widgets/border/default/shade");
mi = e_menu_item_new(m);
@ -3621,8 +3630,8 @@ _e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key)
e_menu_item_toggle_set(mi, (bd->maximized ? 1 : 0));
e_menu_item_callback_set(mi, _e_border_menu_cb_maximize, bd);
e_menu_item_icon_edje_set(mi,
e_theme_edje_file_get("base/theme/borders",
"widgets/border/default/maximize"),
(char *)e_theme_edje_file_get("base/theme/borders",
"widgets/border/default/maximize"),
"widgets/border/default/maximize");
mi = e_menu_item_new(m);
@ -3631,8 +3640,8 @@ _e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key)
e_menu_item_toggle_set(mi, (bd->sticky ? 1 : 0));
e_menu_item_callback_set(mi, _e_border_menu_cb_stick, bd);
e_menu_item_icon_edje_set(mi,
e_theme_edje_file_get("base/theme/borders",
"widgets/border/default/stick"),
(char *)e_theme_edje_file_get("base/theme/borders",
"widgets/border/default/stick"),
"widgets/border/default/stick");
mi = e_menu_item_new(m);
@ -3642,8 +3651,8 @@ _e_border_menu_show(E_Border *bd, Evas_Coord x, Evas_Coord y, int key)
e_menu_item_label_set(mi, _("Send To"));
e_menu_item_submenu_pre_callback_set(mi, _e_border_menu_sendto_pre_cb, bd);
e_menu_item_icon_edje_set(mi,
e_theme_edje_file_get("base/theme/borders",
"widgets/border/default/sendto"),
(char *)e_theme_edje_file_get("base/theme/borders",
"widgets/border/default/sendto"),
"widgets/border/default/sendto");
mi = e_menu_item_new(m);
@ -4130,3 +4139,9 @@ _e_border_cb_focus_fix(void *data)
}
return 1;
}
static void
_e_border_cb_finished(E_Drag *drag, int dropped)
{
e_drag_del(drag);
}

View File

@ -6,15 +6,10 @@
static Evas_List *event_handlers = NULL;
static Evas_List *drop_handlers = NULL;
static Ecore_X_Window drag_win;
static Ecore_Evas *drag_ee = NULL;
static Evas_Object *drag_obj;
static Ecore_X_Window drag_win = 0;
static int visible = 0;
static char *drag_type;
static void *drag_data;
static void (*drag_finished)(void *data, const char *type, int dropped);
static Evas_List *draggies = NULL;
static E_Drag *drag_current = NULL;
static int _e_dnd_cb_mouse_up(void *data, int type, void *event);
static int _e_dnd_cb_mouse_move(void *data, int type, void *event);
@ -31,8 +26,12 @@ e_dnd_init(void)
E_Manager *man;
E_Container *con;
event_handlers = evas_list_append(event_handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, _e_dnd_cb_mouse_up, NULL));
event_handlers = evas_list_append(event_handlers, ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, _e_dnd_cb_mouse_move, NULL));
event_handlers = evas_list_append(event_handlers,
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP,
_e_dnd_cb_mouse_up, NULL));
event_handlers = evas_list_append(event_handlers,
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE,
_e_dnd_cb_mouse_move, NULL));
for (l = e_manager_list(); l; l = l->next)
{
@ -72,7 +71,17 @@ int
e_dnd_shutdown(void)
{
Evas_List *l;
for (l = draggies; l; l = l->next)
{
E_Drag *drag;
drag = l->data;
e_drag_del(drag);
}
evas_list_free(draggies);
draggies = NULL;
for (l = event_handlers; l; l = l->next)
{
Ecore_Event_Handler *h;
@ -96,6 +105,61 @@ e_dnd_shutdown(void)
return 1;
}
E_Drag*
e_drag_new(E_Container *con,
const char *type, void *data,
void (*finished_cb)(E_Drag *drag, int dropped),
const char *icon_path, const char *icon)
{
E_Drag *drag;
Evas_Coord w, h;
drag = E_NEW(E_Drag, 1);
if (!drag) return NULL;
drag->ee = ecore_evas_software_x11_new(NULL, con->win,
0, 0, 10, 10);
ecore_evas_override_set(drag->ee, 1);
ecore_evas_software_x11_direct_resize_set(drag->ee, 1);
ecore_evas_shaped_set(drag->ee, 1);
e_canvas_add(drag->ee);
ecore_evas_borderless_set(drag->ee, 1);
drag->object = edje_object_add(ecore_evas_get(drag->ee));
edje_object_file_set(drag->object, icon_path, icon);
w = h = 24;
evas_object_move(drag->object, 0, 0);
evas_object_resize(drag->object, w, h);
ecore_evas_resize(drag->ee, w, h);
drag->type = strdup(type);
drag->data = data;
drag->cb.finished = finished_cb;
drag->container = con;
return drag;
}
void
e_drag_del(E_Drag *drag)
{
draggies = evas_list_remove(draggies, drag);
evas_object_del(drag->object);
e_canvas_del(drag->ee);
ecore_evas_free(drag->ee);
free(drag->type);
free(drag);
}
void
e_drag_resize(E_Drag *drag, Evas_Coord w, Evas_Coord h)
{
evas_object_resize(drag->object, w, h);
ecore_evas_resize(drag->ee, w, h);
}
int
e_dnd_active(void)
{
@ -103,55 +167,27 @@ e_dnd_active(void)
}
void
e_drag_start(E_Container *con, const char *type, void *data,
void (*finished_cb)(void *data, const char *type, int dropped),
const char *icon_path, const char *icon)
e_drag_start(E_Drag *drag)
{
Evas_List *l;
int w, h;
drag_win = ecore_x_window_input_new(con->win,
con->x, con->y,
con->w, con->h);
drag_win = ecore_x_window_input_new(drag->container->win,
drag->container->x, drag->container->y,
drag->container->w, drag->container->h);
ecore_x_window_show(drag_win);
ecore_x_pointer_confine_grab(drag_win);
ecore_x_keyboard_grab(drag_win);
if (drag_ee)
{
e_canvas_del(drag_ee);
ecore_evas_free(drag_ee);
}
drag_ee = ecore_evas_software_x11_new(NULL, con->win,
0, 0, 10, 10);
ecore_evas_override_set(drag_ee, 1);
ecore_evas_software_x11_direct_resize_set(drag_ee, 1);
ecore_evas_shaped_set(drag_ee, 1);
e_canvas_add(drag_ee);
ecore_evas_borderless_set(drag_ee, 1);
drag_obj = edje_object_add(ecore_evas_get(drag_ee));
edje_object_file_set(drag_obj, icon_path, icon);
w = h = 24;
evas_object_move(drag_obj, 0, 0);
evas_object_resize(drag_obj, w, h);
ecore_evas_resize(drag_ee, w, h);
drag_type = strdup(type);
drag_data = data;
drag_finished = finished_cb;
for (l = drop_handlers; l; l = l->next)
{
E_Drop_Handler *h;
h = l->data;
h->active = !strcmp(h->type, drag_type);
h->active = !strcmp(h->type, drag->type);
}
drag_current = drag;
}
void
@ -163,18 +199,16 @@ e_drag_update(int x, int y)
E_Leave_Event *leave_ev;
int w, h;
if (!drag_ee) return;
if (!visible)
if (!drag_current->visible)
{
evas_object_show(drag_obj);
ecore_evas_show(drag_ee);
ecore_evas_raise(drag_ee);
visible = 1;
evas_object_show(drag_current->object);
ecore_evas_show(drag_current->ee);
ecore_evas_raise(drag_current->ee);
drag_current->visible = 1;
}
evas_object_geometry_get(drag_obj, NULL, NULL, &w, &h);
ecore_evas_move(drag_ee, x - (w / 2), y - (h / 2));
evas_object_geometry_get(drag_current->object, NULL, NULL, &w, &h);
ecore_evas_move(drag_current->ee, x - (w / 2), y - (h / 2));
enter_ev = E_NEW(E_Enter_Event, 1);
enter_ev->x = x;
@ -202,18 +236,18 @@ e_drag_update(int x, int y)
if (!h->entered)
{
if (h->cb.enter)
h->cb.enter(h->data, drag_type, enter_ev);
h->cb.enter(h->data, drag_current->type, enter_ev);
h->entered = 1;
}
if (h->cb.move)
h->cb.move(h->data, drag_type, move_ev);
h->cb.move(h->data, drag_current->type, move_ev);
}
else
{
if (h->entered)
{
if (h->cb.leave)
h->cb.leave(h->data, drag_type, leave_ev);
h->cb.leave(h->data, drag_current->type, leave_ev);
h->entered = 0;
}
}
@ -231,18 +265,9 @@ e_drag_end(int x, int y)
E_Drop_Event *ev;
int dropped;
if (drag_obj)
{
evas_object_del(drag_obj);
drag_obj = NULL;
}
if (drag_ee)
{
e_canvas_del(drag_ee);
ecore_evas_free(drag_ee);
drag_ee = NULL;
}
visible = 0;
if (drag_current->ee)
ecore_evas_hide(drag_current->ee);
drag_current->visible = 0;
ecore_x_pointer_ungrab();
ecore_x_keyboard_ungrab();
@ -250,8 +275,7 @@ e_drag_end(int x, int y)
drag_win = 0;
ev = E_NEW(E_Drop_Event, 1);
if (!ev) goto end;
ev->data = drag_data;
ev->data = drag_current->data;
ev->x = x;
ev->y = y;
@ -268,18 +292,15 @@ e_drag_end(int x, int y)
if ((h->cb.drop)
&& E_INSIDE(x, y, h->x, h->y, h->w, h->h))
{
h->cb.drop(h->data, drag_type, ev);
h->cb.drop(h->data, drag_current->type, ev);
dropped = 1;
}
}
(*drag_finished)(drag_data, drag_type, dropped);
if (drag_current->cb.finished)
drag_current->cb.finished(drag_current, dropped);
free(ev);
end:
free(drag_type);
drag_type = NULL;
drag_data = NULL;
drag_finished = NULL;
drag_current = NULL;
}
E_Drop_Handler *

View File

@ -4,6 +4,7 @@
#ifdef E_TYPEDEFS
typedef struct _E_Drag E_Drag;
typedef struct _E_Drop_Handler E_Drop_Handler;
typedef struct _E_Enter_Event E_Enter_Event;
typedef struct _E_Move_Event E_Move_Event;
@ -14,6 +15,19 @@ typedef struct _E_Drop_Event E_Drop_Event;
#ifndef E_DND_H
#define E_DND_H
struct _E_Drag
{
char *type;
void *data;
struct {
void (*finished)(E_Drag *drag, int dropped);
} cb;
E_Container *container;
Ecore_Evas *ee;
unsigned char visible : 1;
Evas_Object *object;
};
struct _E_Drop_Handler
{
void *data;
@ -55,9 +69,13 @@ EAPI int e_dnd_shutdown(void);
EAPI int e_dnd_active(void);
EAPI void e_drag_start(E_Container *con, const char *type, void *data,
void (*finished_cb)(void *data, const char *type, int dropped),
const char *icon_path, const char *icon);
EAPI E_Drag* e_drag_new(E_Container *con, const char *type, void *data,
void (*finished_cb)(E_Drag *drag, int dropped),
const char *icon_path, const char *icon);
EAPI void e_drag_del(E_Drag *drag);
EAPI void e_drag_resize(E_Drag *drag, Evas_Coord w, Evas_Coord h);
EAPI void e_drag_start(E_Drag *drag);
EAPI void e_drag_update(int x, int y);
EAPI void e_drag_end(int x, int y);

View File

@ -74,7 +74,7 @@ static void _ibar_bar_cb_enter(void *data, const char *type, void *event);
static void _ibar_bar_cb_move(void *data, const char *type, void *event);
static void _ibar_bar_cb_leave(void *data, const char *type, void *event);
static void _ibar_bar_cb_drop(void *data, const char *type, void *event);
static void _ibar_bar_cb_finished(void *data, const char *type, int dropped);
static void _ibar_bar_cb_finished(E_Drag *drag, int dropped);
static void _ibar_icon_cb_intercept_move(void *data, Evas_Object *o, Evas_Coord x, Evas_Coord y);
static void _ibar_icon_cb_intercept_resize(void *data, Evas_Object *o, Evas_Coord w, Evas_Coord h);
@ -1244,11 +1244,16 @@ _ibar_icon_cb_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info
dist = sqrt(pow((ev->cur.output.x - drag_x), 2) + pow((ev->cur.output.y - drag_y), 2));
if (dist > 10)
{
E_Drag *d;
drag = 1;
drag_start = 0;
e_drag_start(ic->ibb->con,
"enlightenment/eapp", ic->app, _ibar_bar_cb_finished,
ic->app->path, "icon");
d = e_drag_new(ic->ibb->con,
"enlightenment/eapp", ic->app, _ibar_bar_cb_finished,
ic->app->path, "icon");
e_drag_resize(d, ic->ibb->ibar->conf->iconsize, ic->ibb->ibar->conf->iconsize);
e_drag_start(d);
evas_event_feed_mouse_up(ic->ibb->evas, 1, EVAS_BUTTON_NONE, NULL);
e_app_remove(ic->app);
}
@ -1528,13 +1533,12 @@ _ibar_bar_cb_drop(void *data, const char *type, void *event)
}
static void
_ibar_bar_cb_finished(void *data, const char *type, int dropped)
_ibar_bar_cb_finished(E_Drag *drag, int dropped)
{
/* Someone took over the eapp. */
if (dropped) return;
/* Unref the object so it will be deleted. */
e_object_unref(E_OBJECT(data));
if (!dropped)
e_object_unref(E_OBJECT(drag->data));
e_drag_del(drag);
}
static void