summaryrefslogtreecommitdiff
path: root/gtk/gtktextview.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2006-12-25 03:57:39 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2006-12-25 03:57:39 +0000
commite7e84bb8ec66acd0244501c6771364dcc5aa7477 (patch)
tree3f4d62250c9198226965caea17520bbe18f066f3 /gtk/gtktextview.c
parent502a54a17c7efb0327415883818dc3f28c543d11 (diff)
downloadgtk+-e7e84bb8ec66acd0244501c6771364dcc5aa7477.tar.gz
Remove debug output.
2006-12-24 Matthias Clasen <mclasen@redhat.com> * gtk/gtktextutil.c: Remove debug output. * gtk/gtktextview.c: Improve the DND scrolling behaviour. (#92387, Carlos Garnacho Parro)
Diffstat (limited to 'gtk/gtktextview.c')
-rw-r--r--gtk/gtktextview.c80
1 files changed, 53 insertions, 27 deletions
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index d5664a8510..6980d09618 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -1,3 +1,4 @@
+/* -*- Mode: C; c-file-style: "gnu"; tab-width: 8 -*- */
/* GTK - The GIMP Toolkit
* gtktextview.c Copyright (C) 2000 Red Hat, Inc.
*
@@ -5507,18 +5508,25 @@ gtk_text_view_unselect (GtkTextView *text_view)
static void
get_iter_at_pointer (GtkTextView *text_view,
- GtkTextIter *iter)
+ GtkTextIter *iter,
+ gint *x,
+ gint *y)
{
- gint x, y;
+ gint xcoord, ycoord;
GdkModifierType state;
gdk_window_get_pointer (text_view->text_window->bin_window,
- &x, &y, &state);
+ &xcoord, &ycoord, &state);
gtk_text_layout_get_iter_at_pixel (text_view->layout,
iter,
- x + text_view->xoffset,
- y + text_view->yoffset);
+ xcoord + text_view->xoffset,
+ ycoord + text_view->yoffset);
+ if (x)
+ *x = xcoord;
+
+ if (y)
+ *y = ycoord;
}
static void
@@ -5528,7 +5536,7 @@ move_mark_to_pointer_and_scroll (GtkTextView *text_view,
GtkTextIter newplace;
GtkTextMark *mark;
- get_iter_at_pointer (text_view, &newplace);
+ get_iter_at_pointer (text_view, &newplace, NULL, NULL);
mark = gtk_text_buffer_get_mark (get_buffer (text_view), mark_name);
@@ -5561,26 +5569,55 @@ selection_scan_timeout (gpointer data)
return TRUE; /* remain installed. */
}
-#define DND_SCROLL_MARGIN 0.20
+#define UPPER_OFFSET_ANCHOR 0.8
+#define LOWER_OFFSET_ANCHOR 0.2
+
+static gboolean
+check_scroll (gdouble offset, GtkAdjustment *adj)
+{
+ if ((offset > UPPER_OFFSET_ANCHOR &&
+ adj->value + adj->page_size < adj->upper) ||
+ (offset < LOWER_OFFSET_ANCHOR &&
+ adj->value > adj->lower))
+ return TRUE;
+
+ return FALSE;
+}
static gint
drag_scan_timeout (gpointer data)
{
GtkTextView *text_view;
GtkTextIter newplace;
+ gint x, y, width, height;
+ gdouble pointer_xoffset, pointer_yoffset;
text_view = GTK_TEXT_VIEW (data);
- get_iter_at_pointer (text_view, &newplace);
+ get_iter_at_pointer (text_view, &newplace, &x, &y);
+ gdk_drawable_get_size (text_view->text_window->bin_window, &width, &height);
gtk_text_buffer_move_mark (get_buffer (text_view),
text_view->dnd_mark,
&newplace);
- DV(g_print (G_STRLOC": scrolling onscreen\n"));
- gtk_text_view_scroll_to_mark (text_view,
- text_view->dnd_mark,
- DND_SCROLL_MARGIN, FALSE, 0.0, 0.0);
+ pointer_xoffset = (gdouble) x / width;
+ pointer_yoffset = (gdouble) y / height;
+
+ if (check_scroll (pointer_xoffset, text_view->hadjustment) ||
+ check_scroll (pointer_yoffset, text_view->vadjustment))
+ {
+ /* do not make offsets surpass lower nor upper anchors, this makes
+ * scrolling speed relative to the distance of the pointer to the
+ * anchors when it moves beyond them.
+ */
+ pointer_xoffset = CLAMP (pointer_xoffset, LOWER_OFFSET_ANCHOR, UPPER_OFFSET_ANCHOR);
+ pointer_yoffset = CLAMP (pointer_yoffset, LOWER_OFFSET_ANCHOR, UPPER_OFFSET_ANCHOR);
+
+ gtk_text_view_scroll_to_mark (text_view,
+ text_view->dnd_mark,
+ 0., TRUE, pointer_xoffset, pointer_yoffset);
+ }
return TRUE;
}
@@ -5709,7 +5746,7 @@ selection_motion_event_handler (GtkTextView *text_view,
gtk_text_buffer_get_iter_at_mark (buffer, &orig_start, data->orig_start);
gtk_text_buffer_get_iter_at_mark (buffer, &orig_end, data->orig_end);
- get_iter_at_pointer (text_view, &cursor);
+ get_iter_at_pointer (text_view, &cursor, NULL, NULL);
start = cursor;
extend_selection (text_view, data->granularity, &start, &end);
@@ -6302,20 +6339,9 @@ gtk_text_view_drag_motion (GtkWidget *widget,
gtk_text_mark_set_visible (text_view->dnd_mark, FALSE);
}
- gtk_text_buffer_move_mark (get_buffer (text_view),
- text_view->dnd_mark,
- &newplace);
-
- DV(g_print (G_STRLOC": scrolling to mark\n"));
- gtk_text_view_scroll_to_mark (text_view,
- text_view->dnd_mark,
- DND_SCROLL_MARGIN, FALSE, 0.0, 0.0);
-
- if (text_view->scroll_timeout != 0) /* reset on every motion event */
- g_source_remove (text_view->scroll_timeout);
-
- text_view->scroll_timeout =
- gdk_threads_add_timeout (50, drag_scan_timeout, text_view);
+ if (!text_view->scroll_timeout)
+ text_view->scroll_timeout =
+ gdk_threads_add_timeout (100, drag_scan_timeout, text_view);
/* TRUE return means don't propagate the drag motion to parent
* widgets that may also be drop sites.