[gtksourceview/wip/various-stuff] Keep interactive completion blocked when buffer changes
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtksourceview/wip/various-stuff] Keep interactive completion blocked when buffer changes
- Date: Wed, 29 Jan 2014 17:02:46 +0000 (UTC)
commit eb1d172a783be6d0efe9a76ccf4b3b5f90986280
Author: Sébastien Wilmet <swilmet gnome org>
Date: Wed Jan 29 17:58:45 2014 +0100
Keep interactive completion blocked when buffer changes
An external counter is needed. There is no function to retrieve the
blocked state of a signal handler.
gtksourceview/gtksourcecompletion.c | 57 +++++++++++++++++++++++++++-------
1 files changed, 45 insertions(+), 12 deletions(-)
---
diff --git a/gtksourceview/gtksourcecompletion.c b/gtksourceview/gtksourcecompletion.c
index e03d870..61e7aea 100644
--- a/gtksourceview/gtksourcecompletion.c
+++ b/gtksourceview/gtksourcecompletion.c
@@ -163,6 +163,9 @@ struct _GtkSourceCompletionPrivate
GList *auto_completion_selection;
GtkSourceCompletionContext *auto_completion_context;
+ /* Number of times the interactive completion is blocked */
+ guint block_interactive_num;
+
/* Properties */
/* Weak reference to the view. You must check if view != NULL before
@@ -1600,6 +1603,24 @@ gtk_source_completion_dispose (GObject *object)
G_OBJECT_CLASS (gtk_source_completion_parent_class)->dispose (object);
}
+/* Unconditionnally block interactive completion, without taking into account
+ * priv->block_interactive_num.
+ * g_signal_handlers_block_by_func() has a counter too, so you may think that
+ * block_interactive_num is useless. But it is useful when the buffer changes,
+ * to keep the signal handler blocked on the new buffer.
+ */
+static void
+block_interactive (GtkSourceCompletion *completion)
+{
+ g_signal_handlers_block_by_func (completion->priv->buffer,
+ buffer_insert_text_cb,
+ completion);
+
+ g_signal_handlers_block_by_func (completion->priv->buffer,
+ buffer_delete_range_cb,
+ completion);
+}
+
static void
connect_buffer (GtkSourceCompletion *completion)
{
@@ -1692,6 +1713,11 @@ connect_buffer (GtkSourceCompletion *completion)
G_CALLBACK (buffer_insert_text_cb),
completion,
G_CONNECT_AFTER);
+
+ if (completion->priv->block_interactive_num > 0)
+ {
+ block_interactive (completion);
+ }
}
static void
@@ -2923,13 +2949,12 @@ gtk_source_completion_block_interactive (GtkSourceCompletion *completion)
return;
}
- g_signal_handlers_block_by_func (completion->priv->buffer,
- buffer_insert_text_cb,
- completion);
+ if (completion->priv->block_interactive_num == 0)
+ {
+ block_interactive (completion);
+ }
- g_signal_handlers_block_by_func (completion->priv->buffer,
- buffer_delete_range_cb,
- completion);
+ completion->priv->block_interactive_num++;
}
/**
@@ -2950,11 +2975,19 @@ gtk_source_completion_unblock_interactive (GtkSourceCompletion *completion)
return;
}
- g_signal_handlers_unblock_by_func (completion->priv->buffer,
- buffer_insert_text_cb,
- completion);
+ if (completion->priv->block_interactive_num == 1)
+ {
+ g_signal_handlers_unblock_by_func (completion->priv->buffer,
+ buffer_insert_text_cb,
+ completion);
- g_signal_handlers_unblock_by_func (completion->priv->buffer,
- buffer_delete_range_cb,
- completion);
+ g_signal_handlers_unblock_by_func (completion->priv->buffer,
+ buffer_delete_range_cb,
+ completion);
+ }
+
+ if (completion->priv->block_interactive_num > 0)
+ {
+ completion->priv->block_interactive_num--;
+ }
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]