summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2004-07-19 18:15:48 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2004-07-19 18:15:48 +0000
commit5351a4e444a991bcc3022edb007b047493d86dd1 (patch)
treee1ce78d7dd1409d1bb9dfd205ef48d8528e21e83
parent23b6bd5378571d027dc03c08843449c130d9fbde (diff)
downloadgtk+-5351a4e444a991bcc3022edb007b047493d86dd1.tar.gz
Support inline autocompletion in entries (#135953)
2004-07-19 Matthias Clasen <mclasen@redhat.com> Support inline autocompletion in entries (#135953) * gtk/gtkentryprivate.h: * gtk/gtkentrycompletion.h: * gtk/gtkentrycompletion.c (gtk_entry_completion_class_init): Add a new signal ::insert-prefix which can be used to override the default inline-completion behaviour. Add two new boolean properties, :popup_completion and :inline_completion which determine how the possible completions should be presented. (gtk_entry_completion_insert_prefix): New function to request a prefix insertion. * gtk/gtkentry.c: Add the necessary glue for inline completion.
-rw-r--r--ChangeLog16
-rw-r--r--ChangeLog.pre-2-1016
-rw-r--r--ChangeLog.pre-2-616
-rw-r--r--ChangeLog.pre-2-816
-rw-r--r--gtk/gtkentry.c159
-rw-r--r--gtk/gtkentrycompletion.c289
-rw-r--r--gtk/gtkentrycompletion.h11
-rw-r--r--gtk/gtkentryprivate.h10
8 files changed, 511 insertions, 22 deletions
diff --git a/ChangeLog b/ChangeLog
index 84d5109d8b..8498d9225e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2004-07-19 Matthias Clasen <mclasen@redhat.com>
+
+ Support inline autocompletion in entries (#135953)
+
+ * gtk/gtkentryprivate.h:
+ * gtk/gtkentrycompletion.h:
+ * gtk/gtkentrycompletion.c (gtk_entry_completion_class_init):
+ Add a new signal ::insert-prefix which can be used to override
+ the default inline-completion behaviour. Add two new boolean
+ properties, :popup_completion and :inline_completion which
+ determine how the possible completions should be presented.
+ (gtk_entry_completion_insert_prefix): New function to request
+ a prefix insertion.
+
+ * gtk/gtkentry.c: Add the necessary glue for inline completion.
+
Sun Jul 18 15:28:24 2004 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkdnd.c (gtk_drag_source_set, gtk_drag_dest_set): Create an
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 84d5109d8b..8498d9225e 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,19 @@
+2004-07-19 Matthias Clasen <mclasen@redhat.com>
+
+ Support inline autocompletion in entries (#135953)
+
+ * gtk/gtkentryprivate.h:
+ * gtk/gtkentrycompletion.h:
+ * gtk/gtkentrycompletion.c (gtk_entry_completion_class_init):
+ Add a new signal ::insert-prefix which can be used to override
+ the default inline-completion behaviour. Add two new boolean
+ properties, :popup_completion and :inline_completion which
+ determine how the possible completions should be presented.
+ (gtk_entry_completion_insert_prefix): New function to request
+ a prefix insertion.
+
+ * gtk/gtkentry.c: Add the necessary glue for inline completion.
+
Sun Jul 18 15:28:24 2004 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkdnd.c (gtk_drag_source_set, gtk_drag_dest_set): Create an
diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6
index 84d5109d8b..8498d9225e 100644
--- a/ChangeLog.pre-2-6
+++ b/ChangeLog.pre-2-6
@@ -1,3 +1,19 @@
+2004-07-19 Matthias Clasen <mclasen@redhat.com>
+
+ Support inline autocompletion in entries (#135953)
+
+ * gtk/gtkentryprivate.h:
+ * gtk/gtkentrycompletion.h:
+ * gtk/gtkentrycompletion.c (gtk_entry_completion_class_init):
+ Add a new signal ::insert-prefix which can be used to override
+ the default inline-completion behaviour. Add two new boolean
+ properties, :popup_completion and :inline_completion which
+ determine how the possible completions should be presented.
+ (gtk_entry_completion_insert_prefix): New function to request
+ a prefix insertion.
+
+ * gtk/gtkentry.c: Add the necessary glue for inline completion.
+
Sun Jul 18 15:28:24 2004 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkdnd.c (gtk_drag_source_set, gtk_drag_dest_set): Create an
diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8
index 84d5109d8b..8498d9225e 100644
--- a/ChangeLog.pre-2-8
+++ b/ChangeLog.pre-2-8
@@ -1,3 +1,19 @@
+2004-07-19 Matthias Clasen <mclasen@redhat.com>
+
+ Support inline autocompletion in entries (#135953)
+
+ * gtk/gtkentryprivate.h:
+ * gtk/gtkentrycompletion.h:
+ * gtk/gtkentrycompletion.c (gtk_entry_completion_class_init):
+ Add a new signal ::insert-prefix which can be used to override
+ the default inline-completion behaviour. Add two new boolean
+ properties, :popup_completion and :inline_completion which
+ determine how the possible completions should be presented.
+ (gtk_entry_completion_insert_prefix): New function to request
+ a prefix insertion.
+
+ * gtk/gtkentry.c: Add the necessary glue for inline completion.
+
Sun Jul 18 15:28:24 2004 Soeren Sandmann <sandmann@daimi.au.dk>
* gtk/gtkdnd.c (gtk_drag_source_set, gtk_drag_dest_set): Create an
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index fdc658d164..9e678ea76b 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -322,6 +322,31 @@ static void get_widget_window_size (GtkEntry *entry,
gint *width,
gint *height);
+/* Completion */
+static gint gtk_entry_completion_timeout (gpointer data);
+static gboolean gtk_entry_completion_key_press (GtkWidget *widget,
+ GdkEventKey *event,
+ gpointer user_data);
+static void gtk_entry_completion_changed (GtkWidget *entry,
+ gpointer user_data);
+static gboolean check_completion_callback (GtkEntryCompletion *completion);
+static void clear_completion_callback (GtkEntry *entry,
+ GParamSpec *pspec);
+static gboolean accept_completion_callback (GtkEntry *entry);
+static void completion_insert_text_callback (GtkEntry *entry,
+ const gchar *text,
+ gint length,
+ gint position,
+ GtkEntryCompletion *completion);
+static void completion_changed (GtkEntryCompletion *completion,
+ GParamSpec *pspec,
+ gpointer data);
+static void disconnect_completion_signals (GtkEntry *entry,
+ GtkEntryCompletion *completion);
+static void connect_completion_signals (GtkEntry *entry,
+ GtkEntryCompletion *completion);
+
+
static GtkWidgetClass *parent_class = NULL;
GType
@@ -4999,6 +5024,122 @@ gtk_entry_completion_changed (GtkWidget *entry,
completion);
}
+static gboolean
+check_completion_callback (GtkEntryCompletion *completion)
+{
+ completion->priv->check_completion_idle = NULL;
+
+ gtk_entry_completion_insert_prefix (completion);
+
+ return FALSE;
+}
+
+static void
+clear_completion_callback (GtkEntry *entry,
+ GParamSpec *pspec)
+{
+ GtkEntryCompletion *completion = gtk_entry_get_completion (entry);
+
+ completion->priv->has_completion = FALSE;
+}
+
+static gboolean
+accept_completion_callback (GtkEntry *entry)
+{
+ GtkEntryCompletion *completion = gtk_entry_get_completion (entry);
+
+ if (completion->priv->has_completion)
+ gtk_editable_set_position (GTK_EDITABLE (entry),
+ entry->text_length);
+
+ return FALSE;
+}
+
+static void
+completion_insert_text_callback (GtkEntry *entry,
+ const gchar *text,
+ gint length,
+ gint position,
+ GtkEntryCompletion *completion)
+{
+ /* idle to update the selection based on the file list */
+ if (completion->priv->check_completion_idle == NULL)
+ {
+ completion->priv->check_completion_idle = g_idle_source_new ();
+ g_source_set_priority (completion->priv->check_completion_idle, G_PRIORITY_HIGH);
+ g_source_set_closure (completion->priv->check_completion_idle,
+ g_cclosure_new_object (G_CALLBACK (check_completion_callback),
+ G_OBJECT (completion)));
+ g_source_attach (completion->priv->check_completion_idle, NULL);
+ }
+}
+
+static void
+completion_changed (GtkEntryCompletion *completion,
+ GParamSpec *pspec,
+ gpointer data)
+{
+ GtkEntry *entry = GTK_ENTRY (data);
+
+ disconnect_completion_signals (entry, completion);
+ connect_completion_signals (entry, completion);
+}
+
+static void
+disconnect_completion_signals (GtkEntry *entry,
+ GtkEntryCompletion *completion)
+{
+ g_signal_handlers_disconnect_by_func (completion,
+ G_CALLBACK (completion_changed), entry);
+ if (completion->priv->changed_id > 0 &&
+ g_signal_handler_is_connected (entry, completion->priv->changed_id))
+ g_signal_handler_disconnect (entry, completion->priv->changed_id);
+ g_signal_handlers_disconnect_by_func (entry,
+ G_CALLBACK (gtk_entry_completion_key_press), completion);
+ if (completion->priv->insert_text_id > 0 &&
+ g_signal_handler_is_connected (entry, completion->priv->insert_text_id))
+ g_signal_handler_disconnect (entry, completion->priv->insert_text_id);
+ g_signal_handlers_disconnect_by_func (entry,
+ G_CALLBACK (completion_insert_text_callback), completion);
+ g_signal_handlers_disconnect_by_func (entry,
+ G_CALLBACK (clear_completion_callback), completion);
+ g_signal_handlers_disconnect_by_func (entry,
+ G_CALLBACK (accept_completion_callback), completion);
+}
+
+static void
+connect_completion_signals (GtkEntry *entry,
+ GtkEntryCompletion *completion)
+{
+ if (completion->priv->popup_completion)
+ {
+ completion->priv->changed_id =
+ g_signal_connect (entry, "changed",
+ G_CALLBACK (gtk_entry_completion_changed), completion);
+ g_signal_connect (entry, "key_press_event",
+ G_CALLBACK (gtk_entry_completion_key_press), completion);
+ }
+
+ if (completion->priv->inline_completion)
+ {
+ completion->priv->insert_text_id =
+ g_signal_connect (entry, "insert_text",
+ G_CALLBACK (completion_insert_text_callback), completion);
+ g_signal_connect (entry, "notify::cursor-position",
+ G_CALLBACK (clear_completion_callback), completion);
+ g_signal_connect (entry, "notify::selection-bound",
+ G_CALLBACK (clear_completion_callback), completion);
+ g_signal_connect (entry, "activate",
+ G_CALLBACK (accept_completion_callback), completion);
+ g_signal_connect (entry, "focus_out_event",
+ G_CALLBACK (accept_completion_callback), completion);
+ }
+ g_signal_connect (completion, "notify::popup_completion",
+ G_CALLBACK (completion_changed), entry);
+ g_signal_connect (completion, "notify::inline_completion",
+ G_CALLBACK (completion_changed), entry);
+}
+
/**
* gtk_entry_set_completion:
* @entry: A #GtkEntry.
@@ -5035,14 +5176,7 @@ gtk_entry_set_completion (GtkEntry *entry,
if (GTK_WIDGET_MAPPED (old->priv->popup_window))
_gtk_entry_completion_popdown (old);
- gtk_cell_layout_clear (GTK_CELL_LAYOUT (old));
- old->priv->text_column = -1;
-
- if (g_signal_handler_is_connected (entry, old->priv->changed_id))
- g_signal_handler_disconnect (entry, old->priv->changed_id);
- if (g_signal_handler_is_connected (entry, old->priv->key_press_id))
- g_signal_handler_disconnect (entry, old->priv->key_press_id);
-
+ disconnect_completion_signals (entry, old);
old->priv->entry = NULL;
g_object_unref (old);
@@ -5057,14 +5191,7 @@ gtk_entry_set_completion (GtkEntry *entry,
/* hook into the entry */
g_object_ref (completion);
- completion->priv->changed_id =
- g_signal_connect (entry, "changed",
- G_CALLBACK (gtk_entry_completion_changed), completion);
-
- completion->priv->key_press_id =
- g_signal_connect (entry, "key_press_event",
- G_CALLBACK (gtk_entry_completion_key_press), completion);
-
+ connect_completion_signals (entry, completion);
completion->priv->entry = GTK_WIDGET (entry);
g_object_set_data (G_OBJECT (entry), GTK_ENTRY_COMPLETION_KEY, completion);
}
diff --git a/gtk/gtkentrycompletion.c b/gtk/gtkentrycompletion.c
index fc86ac3249..6743647b53 100644
--- a/gtk/gtkentrycompletion.c
+++ b/gtk/gtkentrycompletion.c
@@ -41,6 +41,7 @@
/* signals */
enum
{
+ INSERT_PREFIX,
MATCH_SELECTED,
ACTION_ACTIVATED,
LAST_SIGNAL
@@ -52,7 +53,9 @@ enum
PROP_0,
PROP_MODEL,
PROP_MINIMUM_KEY_LENGTH,
- PROP_TEXT_COLUMN
+ PROP_TEXT_COLUMN,
+ PROP_INLINE_COMPLETION,
+ PROP_POPUP_COMPLETION
};
#define GTK_ENTRY_COMPLETION_GET_PRIVATE(obj)(G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ENTRY_COMPLETION, GtkEntryCompletionPrivate))
@@ -128,6 +131,8 @@ static void gtk_entry_completion_action_data_func (GtkTreeViewColumn
static gboolean gtk_entry_completion_match_selected (GtkEntryCompletion *completion,
GtkTreeModel *model,
GtkTreeIter *iter);
+static gboolean gtk_entry_completion_real_insert_prefix (GtkEntryCompletion *completion,
+ gchar *key);
static GObjectClass *parent_class = NULL;
static guint entry_completion_signals[LAST_SIGNAL] = { 0 };
@@ -185,6 +190,35 @@ gtk_entry_completion_class_init (GtkEntryCompletionClass *klass)
object_class->finalize = gtk_entry_completion_finalize;
klass->match_selected = gtk_entry_completion_match_selected;
+ klass->insert_prefix = gtk_entry_completion_real_insert_prefix;
+
+ /**
+ * GtkEntryCompletion::insert-prefix:
+ * @widget: the object which received the signal
+ * @prefix: the common prefix of all possible completions
+ *
+ * The ::insert-prefix signal is emitted when the inline autocompletion
+ * is triggered. The default behaviour is to make the entry display the
+ * whole prefix and select the newly inserted part.
+ *
+ * Applications may connect to this signal in order to insert only a
+ * smaller part of the @prefix into the entry - e.g. the entry used in
+ * the #GtkFileChooser inserts only the part of the prefix up to the
+ * next '/'.
+ *
+ * Return value: %TRUE if the signal has been handled
+ *
+ * Since: 2.6
+ */
+ entry_completion_signals[INSERT_PREFIX] =
+ g_signal_new ("insert_prefix",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GtkEntryCompletionClass, insert_prefix),
+ _gtk_boolean_handled_accumulator, NULL,
+ _gtk_marshal_BOOLEAN__STRING,
+ G_TYPE_BOOLEAN, 1,
+ G_TYPE_STRING);
/**
* GtkEntryCompletion::match-selected:
@@ -198,6 +232,8 @@ gtk_entry_completion_class_init (GtkEntryCompletionClass *klass)
* @iter.
*
* Return value: %TRUE if the signal has been handled
+ *
+ * Since: 2.4
*/
entry_completion_signals[MATCH_SELECTED] =
g_signal_new ("match_selected",
@@ -217,6 +253,8 @@ gtk_entry_completion_class_init (GtkEntryCompletionClass *klass)
*
* The ::action-activated signal is emitted when an action
* is activated.
+ *
+ * Since: 2.4
*/
entry_completion_signals[ACTION_ACTIVATED] =
g_signal_new ("action_activated",
@@ -245,7 +283,7 @@ gtk_entry_completion_class_init (GtkEntryCompletionClass *klass)
1,
G_PARAM_READWRITE));
/**
- * GtkEntryCompletion::text-column:
+ * GtkEntryCompletion:text-column:
*
* The column of the model containing the strings.
*
@@ -261,6 +299,38 @@ gtk_entry_completion_class_init (GtkEntryCompletionClass *klass)
-1,
G_PARAM_READWRITE));
+ /**
+ * GtkEntryCompletion:inline_completion:
+ *
+ * The boolean :inline_completion property determines whether the
+ * common prefix of the possible completions should be inserted
+ * automatically in the entry.
+ *
+ * Since: 2.6
+ **/
+ g_object_class_install_property (object_class,
+ PROP_INLINE_COMPLETION,
+ g_param_spec_boolean ("inline_completion",
+ P_("Inline completion"),
+ P_("Whether the common prefix should be inserted automatically"),
+ FALSE,
+ G_PARAM_READWRITE));
+ /**
+ * GtkEntryCompletion:popup_completion:
+ *
+ * The boolean :popup_completion property determines whether the
+ * possible completions should be shown in a popup window.
+ *
+ * Since: 2.6
+ **/
+ g_object_class_install_property (object_class,
+ PROP_POPUP_COMPLETION,
+ g_param_spec_boolean ("popup_completion",
+ P_("Popup completion"),
+ P_("Whether the completions should be shown in a popup window"),
+ TRUE,
+ G_PARAM_READWRITE));
+
g_type_class_add_private (object_class, sizeof (GtkEntryCompletionPrivate));
}
@@ -289,6 +359,9 @@ gtk_entry_completion_init (GtkEntryCompletion *completion)
priv->minimum_key_length = 1;
priv->text_column = -1;
+ priv->has_completion = FALSE;
+ priv->inline_completion = FALSE;
+ priv->popup_completion = TRUE;
/* completions */
priv->filter_model = NULL;
@@ -410,6 +483,14 @@ gtk_entry_completion_set_property (GObject *object,
priv->text_column = g_value_get_int (value);
break;
+ case PROP_INLINE_COMPLETION:
+ priv->inline_completion = g_value_get_boolean (value);
+ break;
+
+ case PROP_POPUP_COMPLETION:
+ priv->popup_completion = g_value_get_boolean (value);
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -439,6 +520,14 @@ gtk_entry_completion_get_property (GObject *object,
g_value_set_int (value, gtk_entry_completion_get_text_column (completion));
break;
+ case PROP_INLINE_COMPLETION:
+ g_value_set_boolean (value, gtk_entry_completion_get_inline_completion (completion));
+ break;
+
+ case PROP_POPUP_COMPLETION:
+ g_value_set_boolean (value, gtk_entry_completion_get_popup_completion (completion));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1320,3 +1409,199 @@ gtk_entry_completion_match_selected (GtkEntryCompletion *completion,
return TRUE;
}
+
+
+static gchar *
+gtk_entry_completion_compute_prefix (GtkEntryCompletion *completion)
+{
+ GtkTreeIter iter;
+ gchar *prefix = NULL;
+ gboolean valid;
+
+ const gchar *key = gtk_entry_get_text (GTK_ENTRY (completion->priv->entry));
+
+ valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (completion->priv->filter_model),
+ &iter);
+
+ while (valid)
+ {
+ gchar *text;
+
+ gtk_tree_model_get (GTK_TREE_MODEL (completion->priv->filter_model),
+ &iter, completion->priv->text_column, &text,
+ -1);
+
+ if (g_str_has_prefix (text, key))
+ {
+ if (!prefix)
+ prefix = g_strdup (text);
+ else
+ {
+ gchar *p = prefix;
+ const gchar *q = text;
+
+ while (*p && *p == *q)
+ {
+ p++;
+ q++;
+ }
+
+ *p = '\0';
+ }
+ }
+
+ g_free (text);
+ valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (completion->priv->filter_model),
+ &iter);
+ }
+
+ return prefix;
+}
+
+
+static gboolean
+gtk_entry_completion_real_insert_prefix (GtkEntryCompletion *completion,
+ gchar *prefix)
+{
+ if (prefix)
+ {
+ gint key_len;
+ gint prefix_len;
+ gint pos;
+ const gchar *key;
+
+ prefix_len = g_utf8_strlen (prefix, -1);
+
+ key = gtk_entry_get_text (GTK_ENTRY (completion->priv->entry));
+ key_len = g_utf8_strlen (key, -1);
+
+ if (prefix_len > key_len)
+ {
+ gtk_editable_insert_text (GTK_EDITABLE (completion->priv->entry),
+ prefix + key_len, -1, &pos);
+ gtk_editable_select_region (GTK_EDITABLE (completion->priv->entry),
+ key_len, prefix_len);
+
+ completion->priv->has_completion = TRUE;
+ }
+ }
+
+ return TRUE;
+}
+
+/**
+ * gtk_entry_completion_insert_prefix:
+ * @completion: a #GtkEntryCompletion
+ *
+ * Requests a prefix insertion.
+ *
+ * Since: 2.6
+ **/
+void
+gtk_entry_completion_insert_prefix (GtkEntryCompletion *completion)
+{
+ gboolean done;
+ gchar *prefix;
+
+ g_signal_handler_block (completion->priv->entry,
+ completion->priv->insert_text_id);
+ prefix = gtk_entry_completion_compute_prefix (completion);
+ if (prefix)
+ {
+ g_signal_emit (completion, entry_completion_signals[INSERT_PREFIX],
+ 0, prefix, &done);
+ g_free (prefix);
+ }
+ g_signal_handler_unblock (completion->priv->entry,
+ completion->priv->insert_text_id);
+}
+
+/**
+ * gtk_entry_completion_set_inline_completion:
+ * @completion: a #GtkEntryCompletion
+ * @inline_completion: %TRUE to do inline completion
+ *
+ * Sets whether the common prefix of the possible completions should
+ * be automatically inserted in the entry.
+ *
+ * Since: 2.6
+ **/
+void
+gtk_entry_completion_set_inline_completion (GtkEntryCompletion *completion,
+ gboolean inline_completion)
+{
+ g_return_if_fail (GTK_IS_ENTRY_COMPLETION (completion));
+
+ inline_completion = inline_completion != FALSE;
+
+ if (completion->priv->inline_completion != inline_completion)
+ {
+ completion->priv->inline_completion = inline_completion;
+
+ g_object_notify (G_OBJECT (completion), "inline_completion");
+ }
+}
+
+
+/**
+ * gtk_entry_completion_get_inline_completion:
+ * @completion: a #GtkEntryCompletion
+ *
+ * Returns whether the common prefix of the possible completions should
+ * be automatically inserted in the entry.
+ *
+ * Return value: %TRUE if inline completion is turned on
+ *
+ * Since: 2.6
+ **/
+gboolean
+gtk_entry_completion_get_inline_completion (GtkEntryCompletion *completion)
+{
+ g_return_val_if_fail (GTK_IS_ENTRY_COMPLETION (completion), FALSE);
+
+ return completion->priv->inline_completion;
+}
+
+/**
+ * gtk_entry_completion_set_popup_completion:
+ * @completion: a #GtkEntryCompletion
+ * @inline_completion: %TRUE to do popup completion
+ *
+ * Sets whether the completions should be presented in a popup window.
+ *
+ * Since: 2.6
+ **/
+void
+gtk_entry_completion_set_popup_completion (GtkEntryCompletion *completion,
+ gboolean popup_completion)
+{
+ g_return_if_fail (GTK_IS_ENTRY_COMPLETION (completion));
+
+ popup_completion = popup_completion != FALSE;
+
+ if (completion->priv->popup_completion != popup_completion)
+ {
+ completion->priv->popup_completion = popup_completion;
+
+ g_object_notify (G_OBJECT (completion), "popup_completion");
+ }
+}
+
+
+/**
+ * gtk_entry_completion_get_popup_completion:
+ * @completion: a #GtkEntryCompletion
+ *
+ * Returns whether the completions should be presented in a popup window.
+ *
+ * Return value: %TRUE if popup completion is turned on
+ *
+ * Since: 2.6
+ **/
+gboolean
+gtk_entry_completion_get_popup_completion (GtkEntryCompletion *completion)
+{
+ g_return_val_if_fail (GTK_IS_ENTRY_COMPLETION (completion), TRUE);
+
+ return completion->priv->popup_completion;
+}
diff --git a/gtk/gtkentrycompletion.h b/gtk/gtkentrycompletion.h
index 5bdcc4c1ca..72d00c7daf 100644
--- a/gtk/gtkentrycompletion.h
+++ b/gtk/gtkentrycompletion.h
@@ -63,12 +63,13 @@ struct _GtkEntryCompletionClass
GtkTreeIter *iter);
void (* action_activated) (GtkEntryCompletion *completion,
gint index_);
+ gboolean (* insert_prefix) (GtkEntryCompletion *completion,
+ gchar *prefix);
/* Padding for future expansion */
void (*_gtk_reserved0) (void);
void (*_gtk_reserved1) (void);
void (*_gtk_reserved2) (void);
- void (*_gtk_reserved3) (void);
};
/* core */
@@ -89,6 +90,7 @@ void gtk_entry_completion_set_minimum_key_length (GtkEntryComplet
gint length);
gint gtk_entry_completion_get_minimum_key_length (GtkEntryCompletion *completion);
void gtk_entry_completion_complete (GtkEntryCompletion *completion);
+void gtk_entry_completion_insert_prefix (GtkEntryCompletion *completion);
void gtk_entry_completion_insert_action_text (GtkEntryCompletion *completion,
gint index_,
@@ -99,6 +101,13 @@ void gtk_entry_completion_insert_action_markup (GtkEntryComplet
void gtk_entry_completion_delete_action (GtkEntryCompletion *completion,
gint index_);
+void gtk_entry_completion_set_inline_completion (GtkEntryCompletion *completion,
+ gboolean inline_completion);
+gboolean gtk_entry_completion_get_inline_completion (GtkEntryCompletion *completion);
+void gtk_entry_completion_set_popup_completion (GtkEntryCompletion *completion,
+ gboolean popup_completion);
+gboolean gtk_entry_completion_get_popup_completion (GtkEntryCompletion *completion);
+
/* convenience */
void gtk_entry_completion_set_text_column (GtkEntryCompletion *completion,
gint column);
diff --git a/gtk/gtkentryprivate.h b/gtk/gtkentryprivate.h
index aed129e027..7fb369b9ca 100644
--- a/gtk/gtkentryprivate.h
+++ b/gtk/gtkentryprivate.h
@@ -55,10 +55,14 @@ struct _GtkEntryCompletionPrivate
gulong completion_timeout;
gulong changed_id;
- gulong key_press_id;
- gulong key_release_id;
+ gulong insert_text_id;
- gboolean ignore_enter;
+ guint ignore_enter : 1;
+ guint has_completion : 1;
+ guint inline_completion : 1;
+ guint popup_completion : 1;
+
+ GSource *check_completion_idle;
};
gboolean _gtk_entry_completion_resize_popup (GtkEntryCompletion *completion);