entry completion: Make this work again
Connect to GtkText signals where necessary.
This commit is contained in:
@@ -67,6 +67,7 @@
|
||||
#include "gtkentrycompletion.h"
|
||||
|
||||
#include "gtkentryprivate.h"
|
||||
#include "gtktextprivate.h"
|
||||
#include "gtkcelllayout.h"
|
||||
#include "gtkcellareabox.h"
|
||||
|
||||
@@ -496,8 +497,9 @@ propagate_to_entry (GtkEventControllerKey *key,
|
||||
GtkEntryCompletion *completion)
|
||||
{
|
||||
GtkEntryCompletionPrivate *priv = completion->priv;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (priv->entry));
|
||||
|
||||
return gtk_event_controller_key_forward (key, priv->entry);
|
||||
return gtk_event_controller_key_forward (key, GTK_WIDGET (text));
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -894,6 +896,7 @@ gtk_entry_completion_list_activated (GtkTreeView *treeview,
|
||||
gboolean entry_set;
|
||||
GtkTreeModel *model;
|
||||
GtkTreeIter child_iter;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (completion->priv->entry));
|
||||
|
||||
gtk_tree_model_get_iter (GTK_TREE_MODEL (completion->priv->filter_model), &iter, path);
|
||||
gtk_tree_model_filter_convert_iter_to_child_iter (completion->priv->filter_model,
|
||||
@@ -901,12 +904,10 @@ gtk_entry_completion_list_activated (GtkTreeView *treeview,
|
||||
&iter);
|
||||
model = gtk_tree_model_filter_get_model (completion->priv->filter_model);
|
||||
|
||||
g_signal_handler_block (completion->priv->entry,
|
||||
completion->priv->changed_id);
|
||||
g_signal_handler_block (text, completion->priv->changed_id);
|
||||
g_signal_emit (completion, entry_completion_signals[MATCH_SELECTED],
|
||||
0, model, &child_iter, &entry_set);
|
||||
g_signal_handler_unblock (completion->priv->entry,
|
||||
completion->priv->changed_id);
|
||||
g_signal_handler_unblock (text, completion->priv->changed_id);
|
||||
|
||||
_gtk_entry_completion_popdown (completion);
|
||||
}
|
||||
@@ -1493,14 +1494,15 @@ static void
|
||||
gtk_entry_completion_popup (GtkEntryCompletion *completion)
|
||||
{
|
||||
GtkWidget *toplevel;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (completion->priv->entry));
|
||||
|
||||
if (gtk_widget_get_mapped (completion->priv->popup_window))
|
||||
return;
|
||||
|
||||
if (!gtk_widget_get_mapped (completion->priv->entry))
|
||||
if (!gtk_widget_get_mapped (GTK_WIDGET (text)))
|
||||
return;
|
||||
|
||||
if (!gtk_widget_has_focus (completion->priv->entry))
|
||||
if (!gtk_widget_has_focus (GTK_WIDGET (text)))
|
||||
return;
|
||||
|
||||
if (completion->priv->has_grab)
|
||||
@@ -1709,29 +1711,30 @@ gtk_entry_completion_get_completion_prefix (GtkEntryCompletion *completion)
|
||||
|
||||
static void
|
||||
gtk_entry_completion_insert_completion_text (GtkEntryCompletion *completion,
|
||||
const gchar *text)
|
||||
const gchar *new_text)
|
||||
{
|
||||
GtkEntryCompletionPrivate *priv = completion->priv;
|
||||
gint len;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (priv->entry));
|
||||
|
||||
priv = completion->priv;
|
||||
|
||||
if (priv->changed_id > 0)
|
||||
g_signal_handler_block (priv->entry, priv->changed_id);
|
||||
g_signal_handler_block (text, priv->changed_id);
|
||||
|
||||
if (priv->insert_text_id > 0)
|
||||
g_signal_handler_block (priv->entry, priv->insert_text_id);
|
||||
g_signal_handler_block (text, priv->insert_text_id);
|
||||
|
||||
gtk_entry_set_text (GTK_ENTRY (priv->entry), text);
|
||||
gtk_editable_set_text (GTK_EDITABLE (priv->entry), new_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 (text, priv->changed_id);
|
||||
|
||||
if (priv->insert_text_id > 0)
|
||||
g_signal_handler_unblock (priv->entry, priv->insert_text_id);
|
||||
g_signal_handler_unblock (text, priv->insert_text_id);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -1766,13 +1769,13 @@ gtk_entry_completion_insert_prefix (GtkEntryCompletion *completion)
|
||||
{
|
||||
gboolean done;
|
||||
gchar *prefix;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (completion->priv->entry));
|
||||
|
||||
if (completion->priv->insert_text_id > 0)
|
||||
g_signal_handler_block (completion->priv->entry,
|
||||
completion->priv->insert_text_id);
|
||||
g_signal_handler_block (text, completion->priv->insert_text_id);
|
||||
|
||||
prefix = gtk_entry_completion_compute_prefix (completion,
|
||||
gtk_entry_get_text (GTK_ENTRY (completion->priv->entry)));
|
||||
gtk_editable_get_text (GTK_EDITABLE (completion->priv->entry)));
|
||||
|
||||
if (prefix)
|
||||
{
|
||||
@@ -1782,8 +1785,7 @@ gtk_entry_completion_insert_prefix (GtkEntryCompletion *completion)
|
||||
}
|
||||
|
||||
if (completion->priv->insert_text_id > 0)
|
||||
g_signal_handler_unblock (completion->priv->entry,
|
||||
completion->priv->insert_text_id);
|
||||
g_signal_handler_unblock (text, completion->priv->insert_text_id);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2066,6 +2068,7 @@ gtk_entry_completion_key_pressed (GtkEventControllerKey *controller,
|
||||
gint matches, actions = 0;
|
||||
GtkEntryCompletion *completion = GTK_ENTRY_COMPLETION (user_data);
|
||||
GtkWidget *widget = completion->priv->entry;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (widget));
|
||||
|
||||
if (!completion->priv->popup_completion)
|
||||
return FALSE;
|
||||
@@ -2296,10 +2299,10 @@ keypress_completion_out:
|
||||
{
|
||||
gtk_tree_model_filter_convert_iter_to_child_iter (GTK_TREE_MODEL_FILTER (model), &child_iter, &iter);
|
||||
child_model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER (model));
|
||||
g_signal_handler_block (widget, completion->priv->changed_id);
|
||||
g_signal_handler_block (text, completion->priv->changed_id);
|
||||
g_signal_emit_by_name (completion, "match-selected",
|
||||
child_model, &child_iter, &entry_set);
|
||||
g_signal_handler_unblock (widget, completion->priv->changed_id);
|
||||
g_signal_handler_unblock (text, completion->priv->changed_id);
|
||||
|
||||
if (!entry_set)
|
||||
{
|
||||
@@ -2349,7 +2352,6 @@ gtk_entry_completion_changed (GtkWidget *widget,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkEntryCompletion *completion = GTK_ENTRY_COMPLETION (user_data);
|
||||
GtkEntry *entry = GTK_ENTRY (widget);
|
||||
GdkDevice *device;
|
||||
|
||||
if (!completion->priv->popup_completion)
|
||||
@@ -2362,12 +2364,12 @@ gtk_entry_completion_changed (GtkWidget *widget,
|
||||
completion->priv->completion_timeout = 0;
|
||||
}
|
||||
|
||||
if (!gtk_entry_get_text (entry))
|
||||
if (!gtk_editable_get_text (GTK_EDITABLE (widget)))
|
||||
return;
|
||||
|
||||
/* no need to normalize for this test */
|
||||
if (completion->priv->minimum_key_length > 0 &&
|
||||
strcmp ("", gtk_entry_get_text (entry)) == 0)
|
||||
strcmp ("", gtk_editable_get_text (GTK_EDITABLE (widget))) == 0)
|
||||
{
|
||||
if (gtk_widget_get_visible (completion->priv->popup_window))
|
||||
_gtk_entry_completion_popdown (completion);
|
||||
@@ -2401,11 +2403,10 @@ check_completion_callback (GtkEntryCompletion *completion)
|
||||
}
|
||||
|
||||
static void
|
||||
clear_completion_callback (GtkEntry *entry,
|
||||
GParamSpec *pspec)
|
||||
clear_completion_callback (GObject *text,
|
||||
GParamSpec *pspec,
|
||||
GtkEntryCompletion *completion)
|
||||
{
|
||||
GtkEntryCompletion *completion = gtk_entry_get_completion (entry);
|
||||
|
||||
if (!completion->priv->inline_completion)
|
||||
return;
|
||||
|
||||
@@ -2415,22 +2416,20 @@ clear_completion_callback (GtkEntry *entry,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
accept_completion_callback (GtkEntry *entry)
|
||||
accept_completion_callback (GtkEntryCompletion *completion)
|
||||
{
|
||||
GtkEntryCompletion *completion = gtk_entry_get_completion (entry);
|
||||
|
||||
if (!completion->priv->inline_completion)
|
||||
return FALSE;
|
||||
|
||||
if (completion->priv->has_completion)
|
||||
gtk_editable_set_position (GTK_EDITABLE (entry),
|
||||
gtk_entry_buffer_get_length (gtk_entry_get_buffer (entry)));
|
||||
gtk_editable_set_position (GTK_EDITABLE (completion->priv->entry),
|
||||
gtk_entry_buffer_get_length (gtk_entry_get_buffer (GTK_ENTRY (completion->priv->entry))));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
completion_insert_text_callback (GtkEntry *entry,
|
||||
completion_insert_text_callback (GtkText *entry,
|
||||
const gchar *text,
|
||||
gint length,
|
||||
gint position,
|
||||
@@ -2457,26 +2456,21 @@ connect_completion_signals (GtkEntryCompletion *completion)
|
||||
{
|
||||
GtkEntryCompletionPrivate *priv = completion->priv;
|
||||
GtkEventController *controller;
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (priv->entry));
|
||||
|
||||
controller = priv->entry_key_controller = gtk_event_controller_key_new ();
|
||||
g_signal_connect (controller, "key-pressed",
|
||||
G_CALLBACK (gtk_entry_completion_key_pressed), completion);
|
||||
g_signal_connect_swapped (controller, "focus-out",
|
||||
G_CALLBACK (accept_completion_callback),
|
||||
completion->priv->entry);
|
||||
gtk_widget_add_controller (completion->priv->entry, controller);
|
||||
g_signal_connect_swapped (controller, "focus-out", G_CALLBACK (accept_completion_callback), completion);
|
||||
gtk_widget_add_controller (GTK_WIDGET (text), controller);
|
||||
|
||||
completion->priv->changed_id =
|
||||
g_signal_connect (completion->priv->entry, "changed",
|
||||
G_CALLBACK (gtk_entry_completion_changed), completion);
|
||||
g_signal_connect (text, "changed", G_CALLBACK (gtk_entry_completion_changed), completion);
|
||||
|
||||
completion->priv->insert_text_id =
|
||||
g_signal_connect (completion->priv->entry, "insert-text",
|
||||
G_CALLBACK (completion_insert_text_callback), completion);
|
||||
g_signal_connect (completion->priv->entry, "notify",
|
||||
G_CALLBACK (clear_completion_callback), completion);
|
||||
g_signal_connect (completion->priv->entry, "activate",
|
||||
G_CALLBACK (accept_completion_callback), completion);
|
||||
g_signal_connect (text, "insert-text", G_CALLBACK (completion_insert_text_callback), completion);
|
||||
g_signal_connect (text, "notify", G_CALLBACK (clear_completion_callback), completion);
|
||||
g_signal_connect_swapped (text, "activate", G_CALLBACK (accept_completion_callback), completion);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2512,31 +2506,25 @@ unset_accessible_relation (GtkWidget *window,
|
||||
static void
|
||||
disconnect_completion_signals (GtkEntryCompletion *completion)
|
||||
{
|
||||
gtk_widget_remove_controller (completion->priv->entry,
|
||||
completion->priv->entry_key_controller);
|
||||
GtkText *text = gtk_entry_get_text_widget (GTK_ENTRY (completion->priv->entry));
|
||||
|
||||
gtk_widget_remove_controller (GTK_WIDGET (text), completion->priv->entry_key_controller);
|
||||
|
||||
if (completion->priv->changed_id > 0 &&
|
||||
g_signal_handler_is_connected (completion->priv->entry,
|
||||
completion->priv->changed_id))
|
||||
g_signal_handler_is_connected (text, completion->priv->changed_id))
|
||||
{
|
||||
g_signal_handler_disconnect (completion->priv->entry,
|
||||
completion->priv->changed_id);
|
||||
g_signal_handler_disconnect (text, completion->priv->changed_id);
|
||||
completion->priv->changed_id = 0;
|
||||
}
|
||||
if (completion->priv->insert_text_id > 0 &&
|
||||
g_signal_handler_is_connected (completion->priv->entry,
|
||||
completion->priv->insert_text_id))
|
||||
g_signal_handler_is_connected (text, completion->priv->insert_text_id))
|
||||
{
|
||||
g_signal_handler_disconnect (completion->priv->entry,
|
||||
completion->priv->insert_text_id);
|
||||
g_signal_handler_disconnect (text, completion->priv->insert_text_id);
|
||||
completion->priv->insert_text_id = 0;
|
||||
}
|
||||
g_signal_handlers_disconnect_by_func (completion->priv->entry,
|
||||
G_CALLBACK (completion_insert_text_callback), completion);
|
||||
g_signal_handlers_disconnect_by_func (completion->priv->entry,
|
||||
G_CALLBACK (clear_completion_callback), completion);
|
||||
g_signal_handlers_disconnect_by_func (completion->priv->entry,
|
||||
G_CALLBACK (accept_completion_callback), completion);
|
||||
g_signal_handlers_disconnect_by_func (text, G_CALLBACK (completion_insert_text_callback), completion);
|
||||
g_signal_handlers_disconnect_by_func (text, G_CALLBACK (clear_completion_callback), completion);
|
||||
g_signal_handlers_disconnect_by_func (text, G_CALLBACK (accept_completion_callback), completion);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user