Commit a1cf2315 authored by Matthias Clasen's avatar Matthias Clasen
Browse files

Fix up signal ordering issues in GtkEntry

Ensure that text and selection boundaries are in a
consistent state when we emit notifications, that ::insert-text
and ::delete-text are emitted before any changes, and that
::changed is emitted after property notifications when inserting
or deleting text.
parent 5398a160
...@@ -4648,8 +4648,14 @@ gtk_entry_real_insert_text (GtkEditable *editable, ...@@ -4648,8 +4648,14 @@ gtk_entry_real_insert_text (GtkEditable *editable,
* following signal handlers: buffer_inserted_text(), buffer_notify_display_text(), * following signal handlers: buffer_inserted_text(), buffer_notify_display_text(),
* buffer_notify_text(), buffer_notify_length() * buffer_notify_text(), buffer_notify_length()
*/ */
begin_change (GTK_ENTRY (editable));
g_object_freeze_notify (G_OBJECT (editable));
n_inserted = gtk_entry_buffer_insert_text (get_buffer (GTK_ENTRY (editable)), *position, new_text, n_chars); n_inserted = gtk_entry_buffer_insert_text (get_buffer (GTK_ENTRY (editable)), *position, new_text, n_chars);
g_object_thaw_notify (G_OBJECT (editable));
end_change (GTK_ENTRY (editable));
if (n_inserted != n_chars) if (n_inserted != n_chars)
gtk_widget_error_bell (GTK_WIDGET (editable)); gtk_widget_error_bell (GTK_WIDGET (editable));
...@@ -4667,7 +4673,11 @@ gtk_entry_real_delete_text (GtkEditable *editable, ...@@ -4667,7 +4673,11 @@ gtk_entry_real_delete_text (GtkEditable *editable,
* buffer_notify_text(), buffer_notify_length() * buffer_notify_text(), buffer_notify_length()
*/ */
begin_change (GTK_ENTRY (editable));
g_object_freeze_notify (G_OBJECT (editable));
gtk_entry_buffer_delete_text (get_buffer (GTK_ENTRY (editable)), start_pos, end_pos - start_pos); gtk_entry_buffer_delete_text (get_buffer (GTK_ENTRY (editable)), start_pos, end_pos - start_pos);
g_object_thaw_notify (G_OBJECT (editable));
end_change (GTK_ENTRY (editable));
} }
/* GtkEntryBuffer signal handlers /* GtkEntryBuffer signal handlers
...@@ -4681,12 +4691,18 @@ buffer_inserted_text (GtkEntryBuffer *buffer, ...@@ -4681,12 +4691,18 @@ buffer_inserted_text (GtkEntryBuffer *buffer,
{ {
GtkEntryPrivate *priv = entry->priv; GtkEntryPrivate *priv = entry->priv;
guint password_hint_timeout; guint password_hint_timeout;
guint current_pos;
gint selection_bound;
current_pos = priv->current_pos;
if (current_pos > position)
current_pos += n_chars;
if (priv->current_pos > position) selection_bound = priv->selection_bound;
priv->current_pos += n_chars; if (selection_bound > position)
selection_bound += n_chars;
if (priv->selection_bound > position) gtk_entry_set_positions (entry, current_pos, selection_bound);
priv->selection_bound += n_chars;
/* Calculate the password hint if it needs to be displayed. */ /* Calculate the password hint if it needs to be displayed. */
if (n_chars == 1 && !priv->visible) if (n_chars == 1 && !priv->visible)
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment