[nautilus] location-entry: Add helper for setting editable text



commit 1c0d2d188ad31ee5591462807997cd5ad6b041a2
Author: Corey Berla <corey berla me>
Date:   Tue Jul 19 10:05:36 2022 -0700

    location-entry: Add helper for setting editable text
    
    We are setting the editable text on the entry, which in turn
    calls the insert / delete text functions on the GtkText which
    is invoking the signals we attached.  We only want the insert-text
    and delete-text signals to be called when the user is actually
    inputting data.  Add helper nautilus_location_entry_set_text()
    which temporarily blocks the signals while setting text.
    
    Fixes: https://gitlab.gnome.org/GNOME/nautilus/-/issues/2253

 src/nautilus-location-entry.c | 39 +++++++++++++++++++++++++++++++++------
 1 file changed, 33 insertions(+), 6 deletions(-)
---
diff --git a/src/nautilus-location-entry.c b/src/nautilus-location-entry.c
index 470bdeb6d..b3d7e3b7d 100644
--- a/src/nautilus-location-entry.c
+++ b/src/nautilus-location-entry.c
@@ -95,6 +95,17 @@ static guint signals[LAST_SIGNAL];
 
 G_DEFINE_TYPE_WITH_PRIVATE (NautilusLocationEntry, nautilus_location_entry, GTK_TYPE_ENTRY);
 
+static void on_after_insert_text (GtkEditable *editable,
+                                  const gchar *text,
+                                  gint         length,
+                                  gint        *position,
+                                  gpointer     data);
+
+static void on_after_delete_text (GtkEditable *editable,
+                                  gint         start_pos,
+                                  gint         end_pos,
+                                  gpointer     data);
+
 static GFile *
 nautilus_location_entry_get_location (NautilusLocationEntry *entry)
 {
@@ -108,6 +119,22 @@ nautilus_location_entry_get_location (NautilusLocationEntry *entry)
     return location;
 }
 
+static void
+nautilus_location_entry_set_text (NautilusLocationEntry *entry,
+                                  const char            *new_text)
+{
+    GtkEditable *delegate;
+
+    delegate = gtk_editable_get_delegate (GTK_EDITABLE (entry));
+    g_signal_handlers_block_by_func (delegate, G_CALLBACK (on_after_insert_text), entry);
+    g_signal_handlers_block_by_func (delegate, G_CALLBACK (on_after_delete_text), entry);
+
+    gtk_editable_set_text (GTK_EDITABLE (entry), new_text);
+
+    g_signal_handlers_unblock_by_func (delegate, G_CALLBACK (on_after_insert_text), entry);
+    g_signal_handlers_unblock_by_func (delegate, G_CALLBACK (on_after_delete_text), entry);
+}
+
 static void
 emit_location_changed (NautilusLocationEntry *entry)
 {
@@ -184,7 +211,7 @@ nautilus_location_entry_update_current_uri (NautilusLocationEntry *entry,
     g_free (priv->current_directory);
     priv->current_directory = g_strdup (uri);
 
-    gtk_editable_set_text (GTK_EDITABLE (entry), uri);
+    nautilus_location_entry_set_text (entry, uri);
     set_position_and_selection_to_end (GTK_EDITABLE (entry));
 }
 
@@ -620,7 +647,7 @@ on_has_focus_changed (GObject    *object,
     if (priv->has_special_text)
     {
         priv->setting_special_text = TRUE;
-        gtk_editable_set_text (GTK_EDITABLE (entry), "");
+        nautilus_location_entry_set_text (entry, "");
         priv->setting_special_text = FALSE;
     }
 }
@@ -662,7 +689,7 @@ nautilus_location_entry_icon_release (GtkEntry             *gentry,
 
         case NAUTILUS_LOCATION_ENTRY_ACTION_CLEAR:
         {
-            gtk_editable_set_text (GTK_EDITABLE (gentry), "");
+            nautilus_location_entry_set_text (entry, "");
         }
         break;
 
@@ -792,7 +819,7 @@ nautilus_location_entry_activate (GtkEntry *entry)
         {
             /* Fix non absolute paths */
             full_path = g_build_filename (priv->current_directory, path, NULL);
-            gtk_editable_set_text (GTK_EDITABLE (entry), full_path);
+            nautilus_location_entry_set_text (loc_entry, full_path);
             g_free (full_path);
         }
 
@@ -903,7 +930,7 @@ editable_activate_callback (GtkEntry *entry,
 
     if (path != NULL && *path != '\0')
     {
-        gtk_editable_set_text (GTK_EDITABLE (entry), path);
+        nautilus_location_entry_set_text (self, path);
         emit_location_changed (self);
     }
 }
@@ -1022,6 +1049,6 @@ nautilus_location_entry_set_special_text (NautilusLocationEntry *entry,
     priv->special_text = g_strdup (special_text);
 
     priv->setting_special_text = TRUE;
-    gtk_editable_set_text (GTK_EDITABLE (entry), special_text);
+    nautilus_location_entry_set_text (entry, special_text);
     priv->setting_special_text = FALSE;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]