Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/gtk+/ChangeLog,v
retrieving revision 1.7642
diff -u -d -p -r1.7642 ChangeLog
--- ChangeLog	24 Mar 2006 15:06:11 -0000	1.7642
+++ ChangeLog	24 Mar 2006 17:52:35 -0000
@@ -1,3 +1,8 @@
+2006-03-24  Johan Dahlin  <jdahlin@async.com.br>
+
+	* gtk/gtkentry.c (gtk_entry_set_text): Do not emit 
+	GtkEditable::changed twice. Fixes #64998 (Damon Chaplin)	
+
 2006-03-24  Matthias Clasen  <mclasen@redhat.com>
 
 	* gtk/gtktextview.c (gtk_text_view_value_changed): Don't call
Index: gtk/gtkentry.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkentry.c,v
retrieving revision 1.309
diff -u -d -p -r1.309 gtkentry.c
--- gtk/gtkentry.c	22 Mar 2006 16:17:52 -0000	1.309
+++ gtk/gtkentry.c	24 Mar 2006 17:52:38 -0000
@@ -82,6 +82,7 @@ struct _GtkEntryPrivate 
 {
   gfloat xalign;
   gint insert_pos;
+  gboolean emit_changed;
 };
 
 typedef struct _GtkEntryPasswordHint GtkEntryPasswordHint;
@@ -1117,7 +1118,8 @@ gtk_entry_init (GtkEntry *entry)
   entry->has_frame = TRUE;
   entry->truncate_multiline = FALSE;
   priv->xalign = 0.0;
-
+  priv->emit_changed = FALSE;
+  
   gtk_drag_dest_set (GTK_WIDGET (entry),
                      GTK_DEST_DEFAULT_HIGHLIGHT,
                      NULL, 0,
@@ -2370,6 +2372,7 @@ gtk_entry_real_insert_text (GtkEditable 
 			    gint        *position)
 {
   GtkEntry *entry = GTK_ENTRY (editable);
+  GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
   gint index;
   gint n_chars;
   guint password_hint_timeout;
@@ -2474,7 +2477,8 @@ gtk_entry_real_insert_text (GtkEditable 
 
   gtk_entry_recompute (entry);
 
-  g_signal_emit_by_name (editable, "changed");
+  if (priv->emit_changed)
+    g_signal_emit_by_name (editable, "changed");
   g_object_notify (G_OBJECT (editable), "text");
 }
 
@@ -2484,6 +2488,7 @@ gtk_entry_real_delete_text (GtkEditable 
 			    gint         end_pos)
 {
   GtkEntry *entry = GTK_ENTRY (editable);
+  GtkEntryPrivate *priv = GTK_ENTRY_GET_PRIVATE (entry);
 
   if (start_pos < 0)
     start_pos = 0;
@@ -2524,7 +2529,8 @@ gtk_entry_real_delete_text (GtkEditable 
       
       gtk_entry_recompute (entry);
 
-      g_signal_emit_by_name (editable, "changed");
+      if (priv->emit_changed)
+        g_signal_emit_by_name (editable, "changed");
       g_object_notify (G_OBJECT (editable), "text");
     }
 }
@@ -4146,8 +4152,9 @@ void
 gtk_entry_set_text (GtkEntry    *entry,
 		    const gchar *text)
 {
+  GtkEntryPrivate *priv;
+  GtkEditable *editable;
   gint tmp_pos;
-  GtkEntryCompletion *completion;
 
   g_return_if_fail (GTK_IS_ENTRY (entry));
   g_return_if_fail (text != NULL);
@@ -4157,18 +4164,19 @@ gtk_entry_set_text (GtkEntry    *entry,
    */
   if (strcmp (entry->text, text) == 0)
     return;
+  
+  priv = GTK_ENTRY_GET_PRIVATE (entry);
+  priv->emit_changed = FALSE;
 
-  completion = gtk_entry_get_completion (entry);
-  if (completion)
-    g_signal_handler_block (entry, completion->priv->changed_id);
-
-  gtk_editable_delete_text (GTK_EDITABLE (entry), 0, -1);
+  editable = GTK_EDITABLE (entry);
+  gtk_editable_delete_text (editable, 0, -1);
 
   tmp_pos = 0;
-  gtk_editable_insert_text (GTK_EDITABLE (entry), text, strlen (text), &tmp_pos);
+  gtk_editable_insert_text (editable, text, strlen (text), &tmp_pos);
 
-  if (completion)
-    g_signal_handler_unblock (entry, completion->priv->changed_id);
+  priv->emit_changed = TRUE;
+  
+  g_signal_emit_by_name (editable, "changed");
 }
 
 void
