From fd2af88a62dcb83cd6c621895c7d976c62782f48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ant=C3=B3nio=20Fernandes?= Date: Sat, 7 Aug 2021 12:43:00 +0100 Subject: [PATCH] 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;