From 98d487c8df3ae62dcf25306aedc6712e20366e4f Mon Sep 17 00:00:00 2001 From: Sebastian Dransfeld Date: Mon, 27 Oct 2008 14:14:42 +0000 Subject: [PATCH] Clean up drag on border del. SVN revision: 37245 --- src/bin/e_border.c | 6 +++++- src/bin/e_dnd.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/bin/e_border.c b/src/bin/e_border.c index 69df9227a..f127796b1 100644 --- a/src/bin/e_border.c +++ b/src/bin/e_border.c @@ -3745,7 +3745,11 @@ _e_border_del(E_Border *bd) { E_Event_Border_Remove *ev; - printf("Border is gone\n"); + if ((drag_border) && (drag_border->data == bd)) + { + e_object_del(E_OBJECT(drag_border)); + drag_border = NULL; + } if (bd->border_menu) e_menu_deactivate(bd->border_menu); if (bd->border_locks_dialog) diff --git a/src/bin/e_dnd.c b/src/bin/e_dnd.c index ed7755824..b91cee8cb 100644 --- a/src/bin/e_dnd.c +++ b/src/bin/e_dnd.c @@ -883,6 +883,7 @@ _e_drag_end(Ecore_X_Window root, int x, int y) E_Event_Dnd_Drop ev; int dx, dy, dw, dh; Ecore_X_Window win, ignore_win[2]; + E_Drag *tmp; if (!_drag_current) return; ignore_win[0] = _drag_current->evas_win; @@ -911,8 +912,9 @@ _e_drag_end(Ecore_X_Window root, int x, int y) if (_drag_current && !_xdnd) { - e_object_del(E_OBJECT(_drag_current)); + tmp = _drag_current; _drag_current = NULL; + e_object_del(E_OBJECT(tmp)); } return; } @@ -951,8 +953,10 @@ _e_drag_end(Ecore_X_Window root, int x, int y) } if (_drag_current->cb.finished) _drag_current->cb.finished(_drag_current, dropped); - e_object_del(E_OBJECT(_drag_current)); + + tmp = _drag_current; _drag_current = NULL; + e_object_del(E_OBJECT(tmp)); } else { @@ -1048,6 +1052,37 @@ _e_drag_free(E_Drag *drag) { int i; + if (drag == _drag_current) + { + Eina_List *l; + E_Event_Dnd_Leave leave_ev; + + e_grabinput_release(_drag_win, _drag_win); + ecore_x_window_del(_drag_win); + _drag_win = 0; + _drag_win_root = 0; + + leave_ev.x = 0; + leave_ev.y = 0; + for (l = _drop_handlers; l; l = l->next) + { + E_Drop_Handler *h; + + h = l->data; + + if ((h->active) && (h->entered)) + { + if (h->cb.leave) + h->cb.leave(h->cb.data, h->active_type, &leave_ev); + _e_drag_win_hide(h); + } + } + if (drag->cb.finished) + drag->cb.finished(drag, 0); + } + + _drag_current = NULL; + _drag_list = eina_list_remove(_drag_list, drag); E_FREE(drag->shape_rects); @@ -1339,8 +1374,11 @@ _e_dnd_cb_event_dnd_finished(void *data, int type, void *event) if (_drag_current) { - e_object_del(E_OBJECT(_drag_current)); + E_Drag *tmp; + + tmp = _drag_current; _drag_current = NULL; + e_object_del(E_OBJECT(tmp)); } e_grabinput_release(_drag_win, _drag_win);