diff options
author | Owen Taylor <otaylor@redhat.com> | 2001-03-03 21:03:52 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2001-03-03 21:03:52 +0000 |
commit | a859fa13aff7c2ceb848847d58eedf2cfafef54c (patch) | |
tree | 9d597fa475ca374b8f417b9bc377b44246725317 /gtk | |
parent | 8db8ee7455c9e7110c45ddf0bdce9d82cbc72c71 (diff) | |
download | gtk+-a859fa13aff7c2ceb848847d58eedf2cfafef54c.tar.gz |
Add shift-clicking to extend the selection. (Roughly based on patch from
Sat Mar 3 15:39:49 2001 Owen Taylor <otaylor@redhat.com>
* gtk/gtkentry.c (gtk_entry_button_press): Add shift-clicking
to extend the selection. (Roughly based on patch
from Jay Cox, #50939)
* gtk/gtkentry.c (gtk_entry_button_press): Fix triple-clicking
to properly handle previous GDK_BUTTON_PRESS.
(Patch from Jay Cox, #50938)
* gtk/gtkentry.c (gtk_entry_real_delete_text): Move the
'\0' back along with the deleted text. (#51148)
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkentry.c | 84 |
1 files changed, 78 insertions, 6 deletions
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 83ae8285cc..78eb75c8c7 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -1162,11 +1162,72 @@ gtk_entry_button_press (GtkWidget *widget, if (event->button == 1) { - switch (event->type) + gboolean have_selection = gtk_editable_get_selection_bounds (editable, &sel_start, &sel_end); + + if (event->state & GDK_SHIFT_MASK) + { + if (!have_selection) /* select from the current position to the clicked position */ + sel_start = sel_end = entry->current_pos; + + if (tmp_pos > sel_start && tmp_pos < sel_end) + { + /* Truncate current selection */ + entry->current_pos = tmp_pos; + } + else + { + gboolean extend_to_left; + gint start, end; + + /* Figure out what click selects and extend current selection */ + switch (event->type) + { + case GDK_BUTTON_PRESS: + entry->current_pos = entry->selection_bound = tmp_pos; + break; + + case GDK_2BUTTON_PRESS: + gtk_entry_select_word (entry); + break; + + case GDK_3BUTTON_PRESS: + gtk_entry_select_line (entry); + break; + + default: + break; + } + + start = MIN (entry->current_pos, entry->selection_bound); + start = MIN (sel_start, start); + + end = MAX (entry->current_pos, entry->selection_bound); + end = MAX (sel_end, end); + + if (tmp_pos == sel_start || tmp_pos == sel_end) + extend_to_left = (tmp_pos == start); + else + extend_to_left = (end == sel_end); + + if (extend_to_left) + { + entry->selection_bound = end; + entry->current_pos = start; + } + else + { + entry->selection_bound = start; + entry->current_pos = end; + } + } + + gtk_entry_recompute (entry); + } + else /* no shift key */ + switch (event->type) { case GDK_BUTTON_PRESS: - if (gtk_editable_get_selection_bounds (editable, &sel_start, &sel_end) && - tmp_pos >= sel_start && tmp_pos <= sel_end) + if (have_selection && tmp_pos >= sel_start && tmp_pos <= sel_end) { /* Click inside the selection - we'll either start a drag, or * clear the selection @@ -1188,11 +1249,22 @@ gtk_entry_button_press (GtkWidget *widget, break; + case GDK_2BUTTON_PRESS: + /* We ALWAYS receive a GDK_BUTTON_PRESS immediately before + * receiving a GDK_2BUTTON_PRESS so we need to reset + * entry->in_drag which may have been set above + */ + entry->in_drag = FALSE; gtk_entry_select_word (entry); break; - + case GDK_3BUTTON_PRESS: + /* We ALWAYS receive a GDK_BUTTON_PRESS immediately before + * receiving a GDK_3BUTTON_PRESS so we need to reset + * entry->in_drag which may have been set above + */ + entry->in_drag = FALSE; gtk_entry_select_line (entry); break; @@ -1678,7 +1750,7 @@ gtk_entry_real_delete_text (GtkEntry *entry, gint start_index = g_utf8_offset_to_pointer (entry->text, start_pos) - entry->text; gint end_index = g_utf8_offset_to_pointer (entry->text, end_pos) - entry->text; - g_memmove (entry->text + start_index, entry->text + end_index, entry->n_bytes - end_index); + g_memmove (entry->text + start_index, entry->text + end_index, entry->n_bytes + 1 - end_index); entry->text_length -= (end_pos - start_pos); entry->n_bytes -= (end_index - start_index); @@ -2974,7 +3046,7 @@ append_action_signal (GtkEntry *entry, gtk_object_set_data (GTK_OBJECT (menuitem), "gtk-signal", (char *)signal); gtk_signal_connect (GTK_OBJECT (menuitem), "activate", - activate_cb, entry); + GTK_SIGNAL_FUNC (activate_cb), entry); gtk_widget_show (menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); |