diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 22ce005fc..f5d5dee4c 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -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); +} diff --git a/src/bin/e_dnd.c b/src/bin/e_dnd.c index 7d26162c4..24fa17ba3 100644 --- a/src/bin/e_dnd.c +++ b/src/bin/e_dnd.c @@ -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 * diff --git a/src/bin/e_dnd.h b/src/bin/e_dnd.h index 05a13570b..a66166cfd 100644 --- a/src/bin/e_dnd.h +++ b/src/bin/e_dnd.h @@ -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); diff --git a/src/modules/ibar/e_mod_main.c b/src/modules/ibar/e_mod_main.c index 68fff2010..2401d837c 100644 --- a/src/modules/ibar/e_mod_main.c +++ b/src/modules/ibar/e_mod_main.c @@ -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