summaryrefslogtreecommitdiff
path: root/gtk/gtkentrycompletion.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2007-07-16 16:43:54 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2007-07-16 16:43:54 +0000
commit20580e491e58c770fdfa5a2a3a9abfd8e6208641 (patch)
treef97221f47cef8c4d106038ea1b23d098d01b26bb /gtk/gtkentrycompletion.c
parent50a0d3b8eb9f7a4810606d365a9d8e010dcb17b4 (diff)
downloadgtk+-20580e491e58c770fdfa5a2a3a9abfd8e6208641.tar.gz
Fix some issues with some combinations of inline-selection and
2007-07-16 Matthias Clasen <mclasen@redhat.com> Fix some issues with some combinations of inline-selection and inline-completion. (#457384, Christian Persch) * gtk/gtkentry.c (gtk_entry_completion_key_press): Don't store the completion_prefix here, and be careful when using completion_prefix, because it may be NULL. * gtk/gtkentrycompletion.c (gtk_entry_completion_finalize): Free completion_prefix here. * gtk/gtkentrycompletion.c (gtk_entry_completion_real_insert_prefix): (gtk_entry_completion_insert_completion_text): Store the completion_prefix here. svn path=/trunk/; revision=18479
Diffstat (limited to 'gtk/gtkentrycompletion.c')
-rw-r--r--gtk/gtkentrycompletion.c40
1 files changed, 14 insertions, 26 deletions
diff --git a/gtk/gtkentrycompletion.c b/gtk/gtkentrycompletion.c
index b4c748aa3d..8c4268a794 100644
--- a/gtk/gtkentrycompletion.c
+++ b/gtk/gtkentrycompletion.c
@@ -650,6 +650,7 @@ gtk_entry_completion_finalize (GObject *object)
g_object_unref (priv->action_view);
g_free (priv->case_normalized_key);
+ g_free (priv->completion_prefix);
if (priv->popup_window)
gtk_widget_destroy (priv->popup_window);
@@ -1634,6 +1635,9 @@ gtk_entry_completion_real_insert_prefix (GtkEntryCompletion *completion,
key = gtk_entry_get_text (GTK_ENTRY (completion->priv->entry));
key_len = g_utf8_strlen (key, -1);
+ if (completion->priv->completion_prefix == NULL)
+ completion->priv->completion_prefix = g_strdup (key);
+
if (prefix_len > key_len)
{
gint pos = prefix_len;
@@ -1674,44 +1678,28 @@ gtk_entry_completion_insert_completion_text (GtkEntryCompletion *completion,
const gchar *text)
{
GtkEntryCompletionPrivate *priv = completion->priv;
- gchar *needle;
gint len;
priv = completion->priv;
if (priv->changed_id > 0)
- {
- g_signal_handler_block (priv->entry,
- priv->changed_id);
- }
+ g_signal_handler_block (priv->entry, priv->changed_id);
if (priv->insert_text_id > 0)
- {
- g_signal_handler_block (completion->priv->entry,
- completion->priv->insert_text_id);
- }
+ g_signal_handler_block (priv->entry, priv->insert_text_id);
- gtk_entry_set_text (GTK_ENTRY (priv->entry), text);
- needle = strstr (text, completion->priv->completion_prefix);
- if (needle)
- {
- len = g_utf8_strlen (text, -1) - g_utf8_strlen (needle, -1)
- + g_utf8_strlen (priv->completion_prefix, -1);
- gtk_editable_select_region (GTK_EDITABLE (priv->entry),
- len, -1);
- }
+ if (completion->priv->completion_prefix == NULL)
+ completion->priv->completion_prefix = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->entry)));
+ gtk_entry_set_text (GTK_ENTRY (priv->entry), text);
+
+ len = strlen (priv->completion_prefix);
+ gtk_editable_select_region (GTK_EDITABLE (priv->entry), len, -1);
if (priv->changed_id > 0)
- {
- g_signal_handler_unblock (priv->entry,
- priv->changed_id);
- }
+ g_signal_handler_unblock (priv->entry, priv->changed_id);
if (priv->insert_text_id > 0)
- {
- g_signal_handler_unblock (priv->entry,
- priv->insert_text_id);
- }
+ g_signal_handler_unblock (priv->entry, priv->insert_text_id);
}
static gboolean