summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2005-07-11 16:39:44 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2005-07-11 16:39:44 +0000
commit7912643e8f2f7a98d625ce99e8a924b1a2fd744c (patch)
tree5384e45e41926e6f2a22a6f7b49b53166e145354
parent06e72275e87cec4552c78f88c04d58a625b8b5a0 (diff)
downloadgtk+-7912643e8f2f7a98d625ce99e8a924b1a2fd744c.tar.gz
Make double-clicking between words select whitespace. (#309860, Mike
2005-07-11 Matthias Clasen <mclasen@redhat.com> * gtk/gtktextview.c (extend_selection): Make double-clicking between words select whitespace. (#309860, Mike Miller, patch by Paolo Borelli)
-rw-r--r--ChangeLog4
-rw-r--r--ChangeLog.pre-2-104
-rw-r--r--ChangeLog.pre-2-84
-rw-r--r--gtk/gtktextview.c125
4 files changed, 83 insertions, 54 deletions
diff --git a/ChangeLog b/ChangeLog
index 37a57d653d..a73479ad30 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
2005-07-11 Matthias Clasen <mclasen@redhat.com>
+ * gtk/gtktextview.c (extend_selection): Make double-clicking
+ between words select whitespace. (#309860, Mike Miller, patch
+ by Paolo Borelli)
+
* gtk/gtkiconview.c: Documentation improvements. (#309946,
Torsten Schoenfeld)
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 37a57d653d..a73479ad30 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,5 +1,9 @@
2005-07-11 Matthias Clasen <mclasen@redhat.com>
+ * gtk/gtktextview.c (extend_selection): Make double-clicking
+ between words select whitespace. (#309860, Mike Miller, patch
+ by Paolo Borelli)
+
* gtk/gtkiconview.c: Documentation improvements. (#309946,
Torsten Schoenfeld)
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 37a57d653d..a73479ad30 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,5 +1,9 @@
2005-07-11 Matthias Clasen <mclasen@redhat.com>
+ * gtk/gtktextview.c (extend_selection): Make double-clicking
+ between words select whitespace. (#309860, Mike Miller, patch
+ by Paolo Borelli)
+
* gtk/gtkiconview.c: Documentation improvements. (#309946,
Torsten Schoenfeld)
diff --git a/gtk/gtktextview.c b/gtk/gtktextview.c
index 2a11b9ef91..9a1aa73007 100644
--- a/gtk/gtktextview.c
+++ b/gtk/gtktextview.c
@@ -5520,17 +5520,17 @@ typedef enum
/*
* Move @start and @end to the boundaries of the selection unit (indicated by
- * @granularity) which contained @start initially. Return whether @start was
- * contained in a selection unit at all (which may not be the case for words).
+ * @granularity) which contained @start initially.
+ * If the selction unit is SELECT_WORDS and @start is not contained in a word
+ * the selection is extended to all the white spaces between the end of the
+ * word preceding @start and the start of the one following.
*/
-static gboolean
+static void
extend_selection (GtkTextView *text_view,
SelectionGranularity granularity,
GtkTextIter *start,
GtkTextIter *end)
{
- gboolean extend = TRUE;
-
*end = *start;
if (granularity == SELECT_WORDS)
@@ -5547,7 +5547,30 @@ extend_selection (GtkTextView *text_view,
}
}
else
- extend = FALSE;
+ {
+ GtkTextIter tmp;
+
+ tmp = *start;
+ if (gtk_text_iter_backward_visible_word_start (&tmp))
+ gtk_text_iter_forward_visible_word_end (&tmp);
+
+ if (gtk_text_iter_get_line (&tmp) == gtk_text_iter_get_line (start))
+ *start = tmp;
+ else
+ gtk_text_iter_set_line_offset (start, 0);
+
+ tmp = *end;
+ if (!gtk_text_iter_forward_visible_word_end (&tmp))
+ gtk_text_iter_forward_to_end (&tmp);
+
+ if (gtk_text_iter_ends_word (&tmp))
+ gtk_text_iter_backward_visible_word_start (&tmp);
+
+ if (gtk_text_iter_get_line (&tmp) == gtk_text_iter_get_line (end))
+ *end = tmp;
+ else
+ gtk_text_iter_forward_to_line_end (end);
+ }
}
else if (granularity == SELECT_LINES)
{
@@ -5570,8 +5593,6 @@ extend_selection (GtkTextView *text_view,
gtk_text_view_forward_display_line_end (text_view, end);
}
}
-
- return extend;
}
static gint
@@ -5602,63 +5623,59 @@ selection_motion_event_handler (GtkTextView *text_view, GdkEventMotion *event, g
event->x + text_view->xoffset,
event->y + text_view->yoffset);
- if (extend_selection (text_view, granularity, &start, &end))
- {
- /* Extend selection */
- gtk_text_buffer_get_iter_at_mark (buffer,
- &ins,
- gtk_text_buffer_get_insert (buffer));
- gtk_text_buffer_get_iter_at_mark (buffer,
+ extend_selection (text_view, granularity, &start, &end);
+
+ /* Extend selection */
+ gtk_text_buffer_get_iter_at_mark (buffer,
+ &ins,
+ gtk_text_buffer_get_insert (buffer));
+ gtk_text_buffer_get_iter_at_mark (buffer,
&bound,
gtk_text_buffer_get_selection_bound (buffer));
- if (gtk_text_iter_compare (&ins, &bound) < 0)
- {
- old_start = ins;
- old_end = bound;
- }
- else
- {
- old_start = bound;
- old_end = ins;
- }
-
- if (gtk_text_iter_compare (&start, &old_start) < 0)
- {
- /* newly selected unit before the current selection */
- ins = start;
- bound = old_end;
- }
- else if (gtk_text_iter_compare (&old_end, &end) < 0)
- {
- /* newly selected unit after the current selection */
- ins = end;
- bound = old_start;
- }
- else if (gtk_text_iter_equal (&ins, &old_start))
- {
- /* newly selected unit inside the current selection
- at the start */
- if (!gtk_text_iter_equal (&ins, &start))
- ins = end;
- }
- else
- {
- /* newly selected unit inside the current selection
- at the end */
- if (!gtk_text_iter_equal (&ins, &end))
- ins = start;
- }
+ if (gtk_text_iter_compare (&ins, &bound) < 0)
+ {
+ old_start = ins;
+ old_end = bound;
+ }
+ else
+ {
+ old_start = bound;
+ old_end = ins;
+ }
- gtk_text_buffer_select_range (buffer, &ins, &bound);
+ if (gtk_text_iter_compare (&start, &old_start) < 0)
+ {
+ /* newly selected unit before the current selection */
+ ins = start;
+ bound = old_end;
+ }
+ else if (gtk_text_iter_compare (&old_end, &end) < 0)
+ {
+ /* newly selected unit after the current selection */
+ ins = end;
+ bound = old_start;
+ }
+ else if (gtk_text_iter_equal (&ins, &old_start))
+ {
+ /* newly selected unit inside the current selection at the start */
+ if (!gtk_text_iter_equal (&ins, &start))
+ ins = end;
+ }
+ else
+ {
+ /* newly selected unit inside the current selection at the end */
+ if (!gtk_text_iter_equal (&ins, &end))
+ ins = start;
}
+ gtk_text_buffer_select_range (buffer, &ins, &bound);
+
gtk_text_view_scroll_mark_onscreen (text_view,
gtk_text_buffer_get_mark (buffer,
"insert"));
}
-
/* If we had to scroll offscreen, insert a timeout to do so
* again. Note that in the timeout, even if the mouse doesn't
* move, due to this scroll xoffset/yoffset will have changed