[nautilus/wip/antoniof/gtk4-preparation-step-event-controllers: 4/18] location-entry: Check position on idle




commit 380020b5003d2e2e1c626916fcce16338067e53a
Author: António Fernandes <antoniof gnome org>
Date:   Sat Aug 7 12:43:00 2021 +0100

    location-entry: Check position on idle
    
    We only want to do completions when we are typing at the end of the
    text. So, we schedule completions on idle depending on this condition.
    
    But we can achieve the same by checking scheduling unconditionally and
    check for the condition on idle instead. This leads to simpler code,
    resolves a FIXME, and takes code out of the ::event handler, which will
    enable the port to event controllers in preparation for GTK4.

 src/nautilus-location-entry.c | 78 +++++++++++++++++++------------------------
 1 file changed, 34 insertions(+), 44 deletions(-)
---
diff --git a/src/nautilus-location-entry.c b/src/nautilus-location-entry.c
index 6d8f2bf35..b1bda5f79 100644
--- a/src/nautilus-location-entry.c
+++ b/src/nautilus-location-entry.c
@@ -385,6 +385,22 @@ set_prefix_dimming (GtkCellRenderer *completion_cell,
     pango_attr_list_unref (attrs);
 }
 
+static gboolean
+position_and_selection_are_at_end (GtkEditable *editable)
+{
+    int end;
+    int start_sel, end_sel;
+
+    end = get_editable_number_of_chars (editable);
+    if (gtk_editable_get_selection_bounds (editable, &start_sel, &end_sel))
+    {
+        if (start_sel != end || end_sel != end)
+        {
+            return FALSE;
+        }
+    }
+    return gtk_editable_get_position (editable) == end;
+}
 
 /* Update the path completions list based on the current text of the entry. */
 static gboolean
@@ -408,6 +424,15 @@ update_completions_store (gpointer callback_data)
     priv = nautilus_location_entry_get_instance_private (entry);
     editable = GTK_EDITABLE (entry);
 
+    priv->idle_id = 0;
+
+    /* Only do completions when we are typing at the end of the
+     * text. */
+    if (!position_and_selection_are_at_end (editable))
+    {
+        return FALSE;
+    }
+
     if (gtk_editable_get_selection_bounds (editable, &start_sel, NULL))
     {
         user_location = gtk_editable_get_chars (editable, 0, start_sel);
@@ -420,8 +445,6 @@ update_completions_store (gpointer callback_data)
     g_strstrip (user_location);
     set_prefix_dimming (priv->completion_cell, user_location);
 
-    priv->idle_id = 0;
-
     uri_scheme = g_uri_parse_scheme (user_location);
 
     if (!g_path_is_absolute (user_location) && uri_scheme == NULL && user_location[0] != '~')
@@ -534,23 +557,6 @@ entry_would_have_inserted_characters (const GdkEvent *event)
     return ((const GdkEventKey *) event)->length;
 }
 
-static gboolean
-position_and_selection_are_at_end (GtkEditable *editable)
-{
-    int end;
-    int start_sel, end_sel;
-
-    end = get_editable_number_of_chars (editable);
-    if (gtk_editable_get_selection_bounds (editable, &start_sel, &end_sel))
-    {
-        if (start_sel != end || end_sel != end)
-        {
-            return FALSE;
-        }
-    }
-    return gtk_editable_get_position (editable) == end;
-}
-
 static void
 got_completion_data_callback (GFilenameCompleter    *completer,
                               NautilusLocationEntry *entry)
@@ -765,33 +771,17 @@ nautilus_location_entry_on_event (GtkWidget *widget,
         return GDK_EVENT_PROPAGATE;
     }
 
-    /* Only do completions when we are typing at the end of the
-     * text. Do the expand at idle time to avoid slowing down
-     * typing when the directory is large. Only insert an expansion
-     * when we type a key that would have inserted characters.
-     */
-    if (position_and_selection_are_at_end (editable))
-    {
-        /* Only insert a completion if a character was typed. Otherwise,
-         * update the completions store (i.e. in case backspace was pressed)
-         * but don't insert the completion into the entry. */
-        priv->idle_insert_completion = entry_would_have_inserted_characters (event);
 
-        if (priv->idle_id == 0)
-        {
-            priv->idle_id = g_idle_add (update_completions_store, widget);
-        }
-    }
-    else
+    /* Only insert a completion if a character was typed. Otherwise,
+     * update the completions store (i.e. in case backspace was pressed)
+     * but don't insert the completion into the entry. */
+    priv->idle_insert_completion = entry_would_have_inserted_characters (event);
+
+    /* Do the expand at idle time to avoid slowing down typing when the
+     * directory is large. */
+    if (priv->idle_id == 0)
     {
-        /* FIXME: Also might be good to do this when you click
-         * to change the position or selection.
-         */
-        if (priv->idle_id != 0)
-        {
-            g_source_remove (priv->idle_id);
-            priv->idle_id = 0;
-        }
+        priv->idle_id = g_idle_add (update_completions_store, self);
     }
 
     return handled;


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