[gnome-builder/wip/chergert/completion] completion: delay update from text deletion
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/chergert/completion] completion: delay update from text deletion
- Date: Thu, 31 May 2018 06:28:56 +0000 (UTC)
commit 816392dec85aa78fd8cc9665fdecf4d18c3bc5c5
Author: Christian Hergert <chergert redhat com>
Date: Wed May 30 23:27:44 2018 -0700
completion: delay update from text deletion
src/libide/completion/ide-completion.c | 47 +++++++++++++++++++++++++++++++++-
1 file changed, 46 insertions(+), 1 deletion(-)
---
diff --git a/src/libide/completion/ide-completion.c b/src/libide/completion/ide-completion.c
index 3ceaafdb0..60085e15a 100644
--- a/src/libide/completion/ide-completion.c
+++ b/src/libide/completion/ide-completion.c
@@ -117,6 +117,12 @@ struct _IdeCompletion
*/
PangoFontDescription *font_desc;
+ /*
+ * If we have a queued update to refilter after deletions, this will be
+ * set to the GSource id.
+ */
+ guint queued_update;
+
/*
* This value is incremented/decremented based on if we need to suppress
* visibility of the completion window (and avoid doing queries).
@@ -306,6 +312,8 @@ ide_completion_start (IdeCompletion *self,
g_assert (IDE_IS_COMPLETION (self));
g_assert (self->context == NULL);
+ dzl_clear_source (&self->queued_update);
+
if (!ide_completion_compute_bounds (self, &begin, &end))
{
if (activation == IDE_COMPLETION_INTERACTIVE)
@@ -596,6 +604,41 @@ ide_completion_view_move_cursor_cb (IdeCompletion *self,
ide_completion_cancel (self);
}
+static gboolean
+ide_completion_queued_update_cb (gpointer user_data)
+{
+ IdeCompletion *self = user_data;
+
+ g_assert (IDE_IS_COMPLETION (self));
+
+ self->queued_update = 0;
+
+ ide_completion_update (self, IDE_COMPLETION_INTERACTIVE);
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+ide_completion_queue_update (IdeCompletion *self)
+{
+ g_assert (IDE_IS_COMPLETION (self));
+
+ dzl_clear_source (&self->queued_update);
+
+ /*
+ * We hit this code path when the user has deleted text. We want to
+ * introduce just a bit of delay so that deleting under heavy key
+ * repeat will not stall doing lots of refiltering.
+ */
+
+ self->queued_update =
+ gdk_threads_add_timeout_full (G_PRIORITY_LOW,
+ 20,
+ ide_completion_queued_update_cb,
+ self,
+ NULL);
+}
+
static void
ide_completion_buffer_delete_range_cb (IdeCompletion *self,
GtkTextIter *begin,
@@ -611,7 +654,7 @@ ide_completion_buffer_delete_range_cb (IdeCompletion *self,
if (self->context != NULL)
{
if (!ide_completion_is_blocked (self))
- ide_completion_update (self, IDE_COMPLETION_INTERACTIVE);
+ ide_completion_queue_update (self);
}
}
@@ -644,6 +687,8 @@ ide_completion_buffer_insert_text_after_cb (IdeCompletion *self,
g_assert (len > 0);
g_assert (GTK_IS_TEXT_BUFFER (buffer));
+ dzl_clear_source (&self->queued_update);
+
if (ide_completion_is_blocked (self) || !is_single_char (text, len))
{
ide_completion_cancel (self);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]