diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2010-06-08 15:29:10 +0200 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2010-06-15 21:06:11 +0200 |
commit | 385f83ff4a97c3aafb0dd3ae04e53bd4c63f6ea0 (patch) | |
tree | 0ce71e18bf7e31c15f6a96cbcbad984015aea435 | |
parent | 8c957ef3efc94e5fde657b9bf83e5207222df247 (diff) | |
download | gtk+-385f83ff4a97c3aafb0dd3ae04e53bd4c63f6ea0.tar.gz |
GtkTextView: Scroll on the pointer doing DnD.
-rw-r--r-- | gtk/gtktextview.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c index f835f67e47..6fbeae68cd 100644 --- a/gtk/gtktextview.c +++ b/gtk/gtktextview.c @@ -110,6 +110,7 @@ struct _GtkTextViewPrivate guint im_spot_idle; gchar *im_module; GdkDevice *grab_device; + GdkDevice *dnd_device; guint scroll_after_paste : 1; }; @@ -6078,15 +6079,15 @@ static gint drag_scan_timeout (gpointer data) { GtkTextView *text_view; + GtkTextViewPrivate *priv; GtkTextIter newplace; gint x, y, width, height; gdouble pointer_xoffset, pointer_yoffset; - GdkDevice *device; text_view = GTK_TEXT_VIEW (data); - device = gdk_display_get_core_pointer (gtk_widget_get_display (GTK_WIDGET (data))); + priv = GTK_TEXT_VIEW_GET_PRIVATE (text_view); - get_iter_at_pointer (text_view, device, &newplace, &x, &y); + get_iter_at_pointer (text_view, priv->dnd_device, &newplace, &x, &y); gdk_drawable_get_size (text_view->text_window->bin_window, &width, &height); gtk_text_buffer_move_mark (get_buffer (text_view), @@ -6814,11 +6815,16 @@ gtk_text_view_drag_leave (GtkWidget *widget, guint time) { GtkTextView *text_view; + GtkTextViewPrivate *priv; text_view = GTK_TEXT_VIEW (widget); + priv = GTK_TEXT_VIEW_GET_PRIVATE (text_view); gtk_text_mark_set_visible (text_view->dnd_mark, FALSE); - + + if (priv->dnd_device) + priv->dnd_device = NULL; + if (text_view->scroll_timeout != 0) g_source_remove (text_view->scroll_timeout); @@ -6834,6 +6840,7 @@ gtk_text_view_drag_motion (GtkWidget *widget, { GtkTextIter newplace; GtkTextView *text_view; + GtkTextViewPrivate *priv; GtkTextIter start; GtkTextIter end; GdkRectangle target_rect; @@ -6842,6 +6849,7 @@ gtk_text_view_drag_motion (GtkWidget *widget, GdkDragAction suggested_action = 0; text_view = GTK_TEXT_VIEW (widget); + priv = GTK_TEXT_VIEW_GET_PRIVATE (text_view); target_rect = text_view->text_window->allocation; @@ -6911,7 +6919,9 @@ gtk_text_view_drag_motion (GtkWidget *widget, gdk_drag_status (context, 0, time); gtk_text_mark_set_visible (text_view->dnd_mark, FALSE); } - + + priv->dnd_device = gdk_drag_context_get_device (context); + if (!text_view->scroll_timeout) text_view->scroll_timeout = gdk_threads_add_timeout (100, drag_scan_timeout, text_view); |