diff options
-rw-r--r-- | addressbook/ChangeLog | 18 | ||||
-rw-r--r-- | addressbook/gui/widgets/e-addressbook-reflow-adapter.c | 2 | ||||
-rw-r--r-- | addressbook/gui/widgets/e-minicard.c | 67 | ||||
-rw-r--r-- | addressbook/gui/widgets/e-minicard.h | 1 |
4 files changed, 71 insertions, 17 deletions
diff --git a/addressbook/ChangeLog b/addressbook/ChangeLog index 43164cabc1..ab64227662 100644 --- a/addressbook/ChangeLog +++ b/addressbook/ChangeLog @@ -1,3 +1,21 @@ +2001-08-20 Chris Toshok <toshok@ximian.com> + + * gui/widgets/e-addressbook-reflow-adapter.c + (e_addressbook_reflow_adapter_class_init): fix arg info - we're + only passing 1 GTK_TYPE_POINTER arg, not 2. + + * gui/widgets/e-minicard.c (e_minicard_event): lots of fixes for + DnD. For GDK_BUTTON_PRESS, we grab immediately. For + GDK_BUTTON_MOTION, we start the drag after a certain threshold, + and connect to the "drag_end" signal on our canvas so we'll know + when the drag is complete. For GDK_BUTTON_RELEASE, we release the + grab if we were dragging and get the event. + (e_minicard_drag_end): new function, just remove the pointer/gtk + grabs and disconnect. + + * gui/widgets/e-minicard.h (struct _EMinicard): add "gint + drag_button" + 2001-08-20 JP Rosevear <jpr@ximian.com> * backend/pas/pas-backend-file.c diff --git a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c b/addressbook/gui/widgets/e-addressbook-reflow-adapter.c index b9f4917015..97ceb36a1f 100644 --- a/addressbook/gui/widgets/e-addressbook-reflow-adapter.c +++ b/addressbook/gui/widgets/e-addressbook-reflow-adapter.c @@ -548,7 +548,7 @@ e_addressbook_reflow_adapter_class_init (GtkObjectClass *object_class) object_class->type, GTK_SIGNAL_OFFSET (EAddressbookReflowAdapterClass, drag_begin), gtk_marshal_INT__POINTER, - GTK_TYPE_INT, 2, GTK_TYPE_POINTER, GTK_TYPE_POINTER); + GTK_TYPE_INT, 1, GTK_TYPE_POINTER); gtk_object_class_add_signals (object_class, e_addressbook_reflow_adapter_signals, LAST_SIGNAL); diff --git a/addressbook/gui/widgets/e-minicard.c b/addressbook/gui/widgets/e-minicard.c index 6835017a5b..1638ee266c 100644 --- a/addressbook/gui/widgets/e-minicard.c +++ b/addressbook/gui/widgets/e-minicard.c @@ -55,6 +55,7 @@ static void e_minicard_resize_children( EMinicard *e_minicard ); static void remodel( EMinicard *e_minicard ); static gint e_minicard_drag_begin (EMinicard *minicard, GdkEvent *event); +static void e_minicard_drag_end (GtkWidget *canvas, GdkDragContext *context, EMinicard *e_minicard); static GnomeCanvasGroupClass *parent_class = NULL; @@ -509,30 +510,49 @@ e_minicard_event (GnomeCanvasItem *item, GdkEvent *event) } } break; - case GDK_BUTTON_PRESS: - if (event->button.button == 1) { - int ret_val = e_minicard_selected(e_minicard, event); - e_canvas_item_grab_focus(item, TRUE); - e_minicard->button_x = event->button.x; - e_minicard->button_y = event->button.y; - e_minicard->drag_button_down = TRUE; - return ret_val; - } else if (event->button.button == 3) { - return e_minicard_selected(e_minicard, event); + case GDK_BUTTON_PRESS: { + int ret_val = e_minicard_selected(e_minicard, event); + GdkEventMask mask = ((1 << (4 + event->button.button)) | + GDK_POINTER_MOTION_MASK | + GDK_BUTTON_RELEASE_MASK); + + e_canvas_item_grab_focus(item, TRUE); + + if (gnome_canvas_item_grab (GNOME_CANVAS_ITEM (e_minicard), + mask, NULL, event->button.time)) { + return FALSE; } - break; + gtk_grab_add (GTK_WIDGET (GNOME_CANVAS_ITEM (e_minicard)->canvas)); + e_minicard->button_x = event->button.x; + e_minicard->button_y = event->button.y; + e_minicard->drag_button = event->button.button; + e_minicard->drag_button_down = TRUE; + return ret_val; + } case GDK_BUTTON_RELEASE: - e_minicard->drag_button_down = FALSE; + if (e_minicard->drag_button_down && e_minicard->drag_button == event->button.button) { + e_minicard->drag_button = 0; + e_minicard->drag_button_down = FALSE; + e_minicard->button_x = -1; + e_minicard->button_y = -1; + + if (GTK_WIDGET_HAS_GRAB (GNOME_CANVAS_ITEM (e_minicard)->canvas)) { + gtk_grab_remove (GTK_WIDGET (GNOME_CANVAS_ITEM (e_minicard)->canvas)); + gnome_canvas_item_ungrab (GNOME_CANVAS_ITEM (e_minicard), event->button.time); + } + } break; case GDK_MOTION_NOTIFY: - /* shamelessly ripped from e-table.c, complete with - broken stuck-grab behavior */ if (e_minicard->drag_button_down && event->motion.state & GDK_BUTTON1_MASK) { if (MAX (abs (e_minicard->button_x - event->motion.x), abs (e_minicard->button_y - event->motion.y)) > 3) { - gint ret_val = e_minicard_drag_begin(e_minicard, event); + gint ret_val; + + ret_val = e_minicard_drag_begin(e_minicard, event); - printf ("signalled drag begin\n"); + /* now we register with drag end on our canvas so we can know when to release our grab */ + gtk_signal_connect (GTK_OBJECT (GNOME_CANVAS_ITEM (e_minicard)->canvas), + "drag_end", (GtkSignalFunc)e_minicard_drag_end, e_minicard); e_minicard->drag_button_down = FALSE; @@ -935,3 +955,18 @@ e_minicard_drag_begin (EMinicard *minicard, GdkEvent *event) event, &ret_val); return ret_val; } + +static void +e_minicard_drag_end (GtkWidget *canvas, GdkDragContext *context, EMinicard *e_minicard) +{ + e_minicard->drag_button = 0; + e_minicard->drag_button_down = FALSE; + e_minicard->button_x = -1; + e_minicard->button_y = -1; + + gtk_grab_remove (GTK_WIDGET (GNOME_CANVAS_ITEM (e_minicard)->canvas)); + gnome_canvas_item_ungrab (GNOME_CANVAS_ITEM (e_minicard), GDK_CURRENT_TIME); + + gtk_signal_disconnect_by_func (GTK_OBJECT (GNOME_CANVAS_ITEM (e_minicard)->canvas), + (GtkSignalFunc)e_minicard_drag_end, e_minicard); +} diff --git a/addressbook/gui/widgets/e-minicard.h b/addressbook/gui/widgets/e-minicard.h index 5a0f590c23..bd74a24c09 100644 --- a/addressbook/gui/widgets/e-minicard.h +++ b/addressbook/gui/widgets/e-minicard.h @@ -89,6 +89,7 @@ struct _EMinicard guint editable : 1; guint drag_button_down : 1; + gint drag_button; gint button_x; gint button_y; |