[nautilus/wip/antoniof/gtk4-preparation-step-event-controllers: 4/18] location-entry: Check position on idle
- From: António Fernandes <antoniof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/wip/antoniof/gtk4-preparation-step-event-controllers: 4/18] location-entry: Check position on idle
- Date: Fri, 17 Dec 2021 13:33:19 +0000 (UTC)
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]