Commit 7912643e authored by Matthias Clasen's avatar Matthias Clasen Committed by Matthias Clasen

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)
parent 06e72275
2005-07-11 Matthias Clasen <mclasen@redhat.com> 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, * gtk/gtkiconview.c: Documentation improvements. (#309946,
Torsten Schoenfeld) Torsten Schoenfeld)
......
2005-07-11 Matthias Clasen <mclasen@redhat.com> 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, * gtk/gtkiconview.c: Documentation improvements. (#309946,
Torsten Schoenfeld) Torsten Schoenfeld)
......
2005-07-11 Matthias Clasen <mclasen@redhat.com> 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, * gtk/gtkiconview.c: Documentation improvements. (#309946,
Torsten Schoenfeld) Torsten Schoenfeld)
......
...@@ -5520,17 +5520,17 @@ typedef enum ...@@ -5520,17 +5520,17 @@ typedef enum
/* /*
* Move @start and @end to the boundaries of the selection unit (indicated by * Move @start and @end to the boundaries of the selection unit (indicated by
* @granularity) which contained @start initially. Return whether @start was * @granularity) which contained @start initially.
* contained in a selection unit at all (which may not be the case for words). * 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, extend_selection (GtkTextView *text_view,
SelectionGranularity granularity, SelectionGranularity granularity,
GtkTextIter *start, GtkTextIter *start,
GtkTextIter *end) GtkTextIter *end)
{ {
gboolean extend = TRUE;
*end = *start; *end = *start;
if (granularity == SELECT_WORDS) if (granularity == SELECT_WORDS)
...@@ -5547,7 +5547,30 @@ extend_selection (GtkTextView *text_view, ...@@ -5547,7 +5547,30 @@ extend_selection (GtkTextView *text_view,
} }
} }
else 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) else if (granularity == SELECT_LINES)
{ {
...@@ -5570,8 +5593,6 @@ extend_selection (GtkTextView *text_view, ...@@ -5570,8 +5593,6 @@ extend_selection (GtkTextView *text_view,
gtk_text_view_forward_display_line_end (text_view, end); gtk_text_view_forward_display_line_end (text_view, end);
} }
} }
return extend;
} }
static gint static gint
...@@ -5602,63 +5623,59 @@ selection_motion_event_handler (GtkTextView *text_view, GdkEventMotion *event, g ...@@ -5602,63 +5623,59 @@ selection_motion_event_handler (GtkTextView *text_view, GdkEventMotion *event, g
event->x + text_view->xoffset, event->x + text_view->xoffset,
event->y + text_view->yoffset); event->y + text_view->yoffset);
if (extend_selection (text_view, granularity, &start, &end)) extend_selection (text_view, granularity, &start, &end);
{
/* Extend selection */ /* Extend selection */
gtk_text_buffer_get_iter_at_mark (buffer, gtk_text_buffer_get_iter_at_mark (buffer,
&ins, &ins,
gtk_text_buffer_get_insert (buffer)); gtk_text_buffer_get_insert (buffer));
gtk_text_buffer_get_iter_at_mark (buffer, gtk_text_buffer_get_iter_at_mark (buffer,
&bound, &bound,
gtk_text_buffer_get_selection_bound (buffer)); gtk_text_buffer_get_selection_bound (buffer));
if (gtk_text_iter_compare (&ins, &bound) < 0) if (gtk_text_iter_compare (&ins, &bound) < 0)
{ {
old_start = ins; old_start = ins;
old_end = bound; old_end = bound;
} }
else else
{ {
old_start = bound; old_start = bound;
old_end = ins; 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;
}
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_view_scroll_mark_onscreen (text_view,
gtk_text_buffer_get_mark (buffer, gtk_text_buffer_get_mark (buffer,
"insert")); "insert"));
} }
/* If we had to scroll offscreen, insert a timeout to do so /* If we had to scroll offscreen, insert a timeout to do so
* again. Note that in the timeout, even if the mouse doesn't * again. Note that in the timeout, even if the mouse doesn't
* move, due to this scroll xoffset/yoffset will have changed * move, due to this scroll xoffset/yoffset will have changed
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment