Make sure mouse selections work together nicely with keyboard navigation

(gimp_text_tool_motion): always keep the "insert" mark at the mouse
location and the "selection_bound" one at the other end of the
selection.

(gimp_text_tool_key_press): make cursor navigation always move the
"insert" mark, and move "selection_bound" along with it unless shift
is pressed. It was exactly the other way around.
This commit is contained in:
Michael Natterer 2009-06-21 17:33:25 +02:00
parent a7271e6b25
commit 1f91136e35
1 changed files with 74 additions and 65 deletions

View File

@ -703,48 +703,58 @@ gimp_text_tool_motion (GimpTool *tool,
if (text_tool->select_words ||
text_tool->select_lines)
{
/* when selecting words or lines, we always keep the
* cursor at the start and the selection mark at the
* end of the selection
*/
if (offset < text_tool->select_start_offset)
GtkTextIter start;
GtkTextIter end;
gtk_text_buffer_get_iter_at_offset (text_tool->text_buffer,
&cursor, offset);
gtk_text_buffer_get_iter_at_offset (text_tool->text_buffer,
&selection,
text_tool->select_start_offset);
if (offset <= text_tool->select_start_offset)
{
gtk_text_buffer_get_iter_at_offset (text_tool->text_buffer,
&cursor, offset);
gtk_text_buffer_get_iter_at_offset (text_tool->text_buffer,
&selection,
text_tool->select_start_offset);
start = cursor;
end = selection;
}
else
{
gtk_text_buffer_get_iter_at_offset (text_tool->text_buffer,
&cursor,
text_tool->select_start_offset);
gtk_text_buffer_get_iter_at_offset (text_tool->text_buffer,
&selection, offset);
start = selection;
end = cursor;
}
if (text_tool->select_words)
{
if (! gtk_text_iter_starts_word (&cursor))
gtk_text_iter_backward_visible_word_starts (&cursor, 1);
if (! gtk_text_iter_starts_word (&start))
gtk_text_iter_backward_visible_word_starts (&start, 1);
if (! gtk_text_iter_ends_word (&selection) &&
! gtk_text_iter_forward_visible_word_ends (&selection, 1))
gtk_text_iter_forward_to_line_end (&selection);
if (! gtk_text_iter_ends_word (&end) &&
! gtk_text_iter_forward_visible_word_ends (&end, 1))
gtk_text_iter_forward_to_line_end (&end);
}
else if (text_tool->select_lines)
{
gtk_text_iter_set_line_offset (&cursor, 0);
gtk_text_iter_forward_to_line_end (&selection);
gtk_text_iter_set_line_offset (&start, 0);
gtk_text_iter_forward_to_line_end (&end);
}
if (offset <= text_tool->select_start_offset)
{
cursor = start;
selection = end;
}
else
{
selection = start;
cursor = end;
}
}
else
{
if (selection_offset != offset)
if (cursor_offset != offset)
{
gtk_text_buffer_get_iter_at_offset (text_tool->text_buffer,
&selection, offset);
&cursor, offset);
}
}
@ -772,9 +782,10 @@ gimp_text_tool_key_press (GimpTool *tool,
GimpDisplay *display)
{
GimpTextTool *text_tool = GIMP_TEXT_TOOL (tool);
GtkTextMark *insert;
GtkTextMark *selection_bound;
GtkTextIter cursor, selection;
GtkTextMark *cursor_mark;
GtkTextMark *selection_mark;
GtkTextIter cursor;
GtkTextIter selection;
GtkTextIter *sel_start;
gint x_pos = -1;
gboolean retval = TRUE;
@ -790,18 +801,18 @@ gimp_text_tool_key_press (GimpTool *tool,
return TRUE;
}
insert = gtk_text_buffer_get_insert (text_tool->text_buffer);
selection_bound = gtk_text_buffer_get_selection_bound (text_tool->text_buffer);
cursor_mark = gtk_text_buffer_get_insert (text_tool->text_buffer);
selection_mark = gtk_text_buffer_get_selection_bound (text_tool->text_buffer);
gtk_text_buffer_get_iter_at_mark (text_tool->text_buffer,
&cursor, insert);
&cursor, cursor_mark);
gtk_text_buffer_get_iter_at_mark (text_tool->text_buffer,
&selection, selection_bound);
&selection, selection_mark);
if (kevent->state & GDK_SHIFT_MASK)
sel_start = &cursor;
else
sel_start = &selection;
else
sel_start = &cursor;
gimp_draw_tool_pause (GIMP_DRAW_TOOL (tool));
@ -835,29 +846,29 @@ gimp_text_tool_key_press (GimpTool *tool,
case GDK_KP_Left:
if (kevent->state & GDK_CONTROL_MASK)
{
gtk_text_iter_backward_visible_word_starts (&selection, 1);
gtk_text_iter_backward_visible_word_starts (&cursor, 1);
}
else
{
gtk_text_iter_backward_cursor_position (&selection);
gtk_text_iter_backward_cursor_position (&cursor);
}
gtk_text_buffer_select_range (text_tool->text_buffer, sel_start,
&selection);
gtk_text_buffer_select_range (text_tool->text_buffer,
&cursor, sel_start);
break;
case GDK_Right:
case GDK_KP_Right:
if (kevent->state & GDK_CONTROL_MASK)
{
if (! gtk_text_iter_forward_visible_word_ends (&selection, 1))
gtk_text_iter_forward_to_line_end (&selection);
if (! gtk_text_iter_forward_visible_word_ends (&cursor, 1))
gtk_text_iter_forward_to_line_end (&cursor);
}
else
{
gtk_text_iter_forward_cursor_position (&selection);
gtk_text_iter_forward_cursor_position (&cursor);
}
gtk_text_buffer_select_range (text_tool->text_buffer, sel_start,
&selection);
gtk_text_buffer_select_range (text_tool->text_buffer,
&cursor, sel_start);
gimp_text_tool_reset_im_context (text_tool);
break;
@ -877,8 +888,8 @@ gimp_text_tool_key_press (GimpTool *tool,
layout = gimp_text_layout_get_pango_layout (text_tool->layout);
line = gtk_text_iter_get_line (&selection);
line_index = gtk_text_iter_get_line_index (&selection);
line = gtk_text_iter_get_line (&cursor);
line_index = gtk_text_iter_get_line_index (&cursor);
layout_iter = pango_layout_get_iter (layout);
for (i = 0; i < line; i++)
@ -908,9 +919,9 @@ gimp_text_tool_key_press (GimpTool *tool,
line--;
if (line < 0)
{
gtk_text_iter_set_line_offset (&selection, 0);
gtk_text_buffer_select_range (text_tool->text_buffer, sel_start,
&selection);
gtk_text_iter_set_line_offset (&cursor, 0);
gtk_text_buffer_select_range (text_tool->text_buffer,
&cursor, sel_start);
break;
}
}
@ -926,15 +937,15 @@ gimp_text_tool_key_press (GimpTool *tool,
if (kevent->keyval == GDK_Up ||
kevent->keyval == GDK_KP_Up)
{
gtk_text_iter_set_line_offset (&selection, 0);
gtk_text_buffer_select_range (text_tool->text_buffer, sel_start,
&selection);
gtk_text_iter_set_line_offset (&cursor, 0);
gtk_text_buffer_select_range (text_tool->text_buffer,
&cursor, sel_start);
}
else
{
gtk_text_iter_forward_to_line_end (&selection);
gtk_text_buffer_select_range (text_tool->text_buffer, sel_start,
&selection);
gtk_text_iter_forward_to_line_end (&cursor);
gtk_text_buffer_select_range (text_tool->text_buffer,
&cursor, sel_start);
}
break;
}
@ -953,31 +964,29 @@ gimp_text_tool_key_press (GimpTool *tool,
line_index -= layout_line->start_index;
gtk_text_buffer_get_iter_at_line_index (text_tool->text_buffer,
&selection,
&cursor,
line, line_index);
while (trailing--)
gtk_text_iter_forward_char (&selection);
gtk_text_iter_forward_char (&cursor);
gtk_text_buffer_place_cursor (text_tool->text_buffer, &selection);
gtk_text_buffer_select_range (text_tool->text_buffer, sel_start,
&selection);
gtk_text_buffer_select_range (text_tool->text_buffer,
&cursor, sel_start);
}
break;
case GDK_Home:
case GDK_KP_Home:
gtk_text_iter_set_line (&selection, gtk_text_iter_get_line (&selection));
gtk_text_buffer_select_range (text_tool->text_buffer, sel_start,
&selection);
gtk_text_iter_set_line_offset (&cursor, 0);
gtk_text_buffer_select_range (text_tool->text_buffer,
&cursor, sel_start);
break;
case GDK_End:
case GDK_KP_End:
gtk_text_iter_set_line (&selection, gtk_text_iter_get_line (&selection));
gtk_text_iter_forward_to_line_end (&selection);
gtk_text_buffer_select_range (text_tool->text_buffer, sel_start,
&selection);
gtk_text_iter_forward_to_line_end (&cursor);
gtk_text_buffer_select_range (text_tool->text_buffer,
&cursor, sel_start);
break;
default: