[gnome-builder] source-view: use EggSignalGroup to manage buffer signals
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] source-view: use EggSignalGroup to manage buffer signals
- Date: Fri, 1 May 2015 22:48:15 +0000 (UTC)
commit f68f3246d8511d582ebbb88389add7353eb5d1e9
Author: Christian Hergert <christian hergert me>
Date: Fri May 1 15:48:00 2015 -0700
source-view: use EggSignalGroup to manage buffer signals
Instead of managing all the individual handlers and their emission state
manually, use EggSignalGroup to manage them as a set.
This doesn't quite delete enough code from IdeSourceView, but I hope we
can get there soon. In particular, we still have to connect to
notify::buffer. That can be changed to notify::target in the EggSignalGroup
or we can add ::bind/::unbind signals which might read a bit cleaner.
Additionally, it would be nice to use signal groups for the completion
sub-object.
Lots to do!
libide/ide-source-view.c | 236 +++++++++++++++++++---------------------------
1 files changed, 97 insertions(+), 139 deletions(-)
---
diff --git a/libide/ide-source-view.c b/libide/ide-source-view.c
index ff2fdfd..94cddf7 100644
--- a/libide/ide-source-view.c
+++ b/libide/ide-source-view.c
@@ -21,6 +21,8 @@
#include <glib/gi18n.h>
#include <stdlib.h>
+#include "egg-signal-group.h"
+
#include "ide-animation.h"
#include "ide-back-forward-item.h"
#include "ide-back-forward-list.h"
@@ -105,18 +107,7 @@ typedef struct
GBinding *right_margin_position_binding;
GBinding *indent_style_binding;
- gulong buffer_changed_handler;
- gulong buffer_delete_range_after_handler;
- gulong buffer_delete_range_handler;
- gulong buffer_insert_text_after_handler;
- gulong buffer_insert_text_handler;
- gulong buffer_line_flags_changed_handler;
- gulong buffer_loaded_handler;
- gulong buffer_mark_set_handler;
- gulong buffer_notify_file_handler;
- gulong buffer_notify_highlight_diagnostics_handler;
- gulong buffer_notify_language_handler;
- gulong buffer_notify_style_scheme_handler;
+ EggSignalGroup *buffer_signals;
guint change_sequence;
@@ -387,14 +378,7 @@ ide_source_view_block_handlers (IdeSourceView *self)
g_assert (IDE_IS_SOURCE_VIEW (self));
- if (priv->buffer)
- {
- g_signal_handler_block (priv->buffer, priv->buffer_insert_text_handler);
- g_signal_handler_block (priv->buffer, priv->buffer_insert_text_after_handler);
- g_signal_handler_block (priv->buffer, priv->buffer_delete_range_handler);
- g_signal_handler_block (priv->buffer, priv->buffer_delete_range_after_handler);
- g_signal_handler_block (priv->buffer, priv->buffer_mark_set_handler);
- }
+ egg_signal_group_block (priv->buffer_signals);
}
static void
@@ -404,14 +388,7 @@ ide_source_view_unblock_handlers (IdeSourceView *self)
g_assert (IDE_IS_SOURCE_VIEW (self));
- if (priv->buffer)
- {
- g_signal_handler_unblock (priv->buffer, priv->buffer_insert_text_handler);
- g_signal_handler_unblock (priv->buffer, priv->buffer_insert_text_after_handler);
- g_signal_handler_unblock (priv->buffer, priv->buffer_delete_range_handler);
- g_signal_handler_unblock (priv->buffer, priv->buffer_delete_range_after_handler);
- g_signal_handler_unblock (priv->buffer, priv->buffer_mark_set_handler);
- }
+ egg_signal_group_unblock (priv->buffer_signals);
}
static gboolean
@@ -1160,13 +1137,12 @@ ide_source_view_invalidate_range_mark (IdeSourceView *self,
}
static void
-ide_source_view__buffer_insert_text_cb (GtkTextBuffer *buffer,
+ide_source_view__buffer_insert_text_cb (IdeSourceView *self,
GtkTextIter *iter,
gchar *text,
gint len,
- gpointer user_data)
+ GtkTextBuffer *buffer)
{
- IdeSourceView *self= user_data;
IdeSourceViewPrivate *priv = ide_source_view_get_instance_private (self);
IdeSourceSnippet *snippet;
@@ -1181,17 +1157,17 @@ ide_source_view__buffer_insert_text_cb (GtkTextBuffer *buffer,
}
static void
-ide_source_view__buffer_insert_text_after_cb (GtkTextBuffer *buffer,
+ide_source_view__buffer_insert_text_after_cb (IdeSourceView *self,
GtkTextIter *iter,
gchar *text,
gint len,
- gpointer user_data)
+ GtkTextBuffer *buffer)
{
- IdeSourceView *self = user_data;
IdeSourceViewPrivate *priv = ide_source_view_get_instance_private (self);
IdeSourceSnippet *snippet;
g_assert (IDE_IS_SOURCE_VIEW (self));
+ g_assert (GTK_IS_TEXT_BUFFER (buffer));
if ((snippet = g_queue_peek_head (priv->snippets)))
{
@@ -1209,16 +1185,16 @@ ide_source_view__buffer_insert_text_after_cb (GtkTextBuffer *buffer,
}
static void
-ide_source_view__buffer_delete_range_cb (GtkTextBuffer *buffer,
+ide_source_view__buffer_delete_range_cb (IdeSourceView *self,
GtkTextIter *begin,
GtkTextIter *end,
- gpointer user_data)
+ GtkTextBuffer *buffer)
{
- IdeSourceView *self = user_data;
IdeSourceViewPrivate *priv = ide_source_view_get_instance_private (self);
IdeSourceSnippet *snippet;
g_assert (IDE_IS_SOURCE_VIEW (self));
+ g_assert (GTK_IS_TEXT_BUFFER (buffer));
if ((snippet = g_queue_peek_head (priv->snippets)))
{
@@ -1238,16 +1214,16 @@ ide_source_view__buffer_delete_range_cb (GtkTextBuffer *buffer,
}
static void
-ide_source_view__buffer_delete_range_after_cb (GtkTextBuffer *buffer,
+ide_source_view__buffer_delete_range_after_cb (IdeSourceView *self,
GtkTextIter *begin,
GtkTextIter *end,
- gpointer user_data)
+ GtkTextBuffer *buffer)
{
- IdeSourceView *self = user_data;
IdeSourceViewPrivate *priv = ide_source_view_get_instance_private (self);
IdeSourceSnippet *snippet;
g_assert (IDE_IS_SOURCE_VIEW (self));
+ g_assert (GTK_IS_TEXT_BUFFER (buffer));
ide_source_view_block_handlers (self);
@@ -1258,19 +1234,19 @@ ide_source_view__buffer_delete_range_after_cb (GtkTextBuffer *buffer,
}
static void
-ide_source_view__buffer_mark_set_cb (GtkTextBuffer *buffer,
+ide_source_view__buffer_mark_set_cb (IdeSourceView *self,
GtkTextIter *iter,
GtkTextMark *mark,
- gpointer user_data)
+ GtkTextBuffer *buffer)
{
- IdeSourceView *self = user_data;
IdeSourceViewPrivate *priv = ide_source_view_get_instance_private (self);
IdeSourceSnippet *snippet;
GtkTextMark *insert;
g_assert (IDE_IS_SOURCE_VIEW (self));
- g_assert (iter);
+ g_assert (iter != NULL);
g_assert (GTK_IS_TEXT_MARK (mark));
+ g_assert (GTK_IS_TEXT_BUFFER (buffer));
insert = gtk_text_buffer_get_insert (buffer);
@@ -1384,90 +1360,6 @@ ide_source_view_connect_buffer (IdeSourceView *self,
priv->completion_blocked = TRUE;
}
- priv->buffer_changed_handler =
- g_signal_connect_object (buffer,
- "changed",
- G_CALLBACK (ide_source_view__buffer_changed_cb),
- self,
- G_CONNECT_SWAPPED);
-
- priv->buffer_line_flags_changed_handler =
- g_signal_connect_object (buffer,
- "line-flags-changed",
- G_CALLBACK (ide_source_view__buffer_line_flags_changed_cb),
- self,
- G_CONNECT_SWAPPED);
-
- priv->buffer_notify_highlight_diagnostics_handler =
- g_signal_connect_object (buffer,
- "notify::highlight-diagnostics",
- G_CALLBACK (ide_source_view__buffer_notify_highlight_diagnostics_cb),
- self,
- G_CONNECT_SWAPPED);
-
- priv->buffer_notify_file_handler =
- g_signal_connect_object (buffer,
- "notify::file",
- G_CALLBACK (ide_source_view__buffer_notify_file_cb),
- self,
- G_CONNECT_SWAPPED);
-
- priv->buffer_notify_language_handler =
- g_signal_connect_object (buffer,
- "notify::language",
- G_CALLBACK (ide_source_view__buffer_notify_language_cb),
- self,
- G_CONNECT_SWAPPED);
-
- priv->buffer_notify_style_scheme_handler =
- g_signal_connect_object (buffer,
- "notify::style-scheme",
- G_CALLBACK (ide_source_view__buffer_notify_style_scheme_cb),
- self,
- G_CONNECT_SWAPPED);
-
- priv->buffer_insert_text_handler =
- g_signal_connect_object (buffer,
- "insert-text",
- G_CALLBACK (ide_source_view__buffer_insert_text_cb),
- self,
- 0);
-
- priv->buffer_insert_text_after_handler =
- g_signal_connect_object (buffer,
- "insert-text",
- G_CALLBACK (ide_source_view__buffer_insert_text_after_cb),
- self,
- G_CONNECT_AFTER);
-
- priv->buffer_delete_range_handler =
- g_signal_connect_object (buffer,
- "delete-range",
- G_CALLBACK (ide_source_view__buffer_delete_range_cb),
- self,
- 0);
-
- priv->buffer_delete_range_after_handler =
- g_signal_connect_object (buffer,
- "delete-range",
- G_CALLBACK (ide_source_view__buffer_delete_range_after_cb),
- self,
- G_CONNECT_AFTER);
-
- priv->buffer_mark_set_handler =
- g_signal_connect_object (buffer,
- "mark-set",
- G_CALLBACK (ide_source_view__buffer_mark_set_cb),
- self,
- 0);
-
- priv->buffer_loaded_handler =
- g_signal_connect_object (buffer,
- "loaded",
- G_CALLBACK (ide_source_view__buffer_loaded_cb),
- self,
- G_CONNECT_SWAPPED);
-
search_settings = g_object_new (GTK_SOURCE_TYPE_SEARCH_SETTINGS,
"wrap-around", TRUE,
"regex-enabled", FALSE,
@@ -1518,17 +1410,6 @@ ide_source_view_disconnect_buffer (IdeSourceView *self,
g_assert (IDE_IS_SOURCE_VIEW (self));
g_assert (IDE_IS_BUFFER (buffer));
- ide_clear_signal_handler (buffer, &priv->buffer_delete_range_after_handler);
- ide_clear_signal_handler (buffer, &priv->buffer_delete_range_handler);
- ide_clear_signal_handler (buffer, &priv->buffer_insert_text_after_handler);
- ide_clear_signal_handler (buffer, &priv->buffer_insert_text_handler);
- ide_clear_signal_handler (buffer, &priv->buffer_line_flags_changed_handler);
- ide_clear_signal_handler (buffer, &priv->buffer_mark_set_handler);
- ide_clear_signal_handler (buffer, &priv->buffer_notify_highlight_diagnostics_handler);
- ide_clear_signal_handler (buffer, &priv->buffer_notify_language_handler);
- ide_clear_signal_handler (buffer, &priv->buffer_notify_style_scheme_handler);
- ide_clear_signal_handler (buffer, &priv->buffer_loaded_handler);
-
if (priv->completion_blocked)
{
GtkSourceCompletion *completion;
@@ -4863,6 +4744,7 @@ ide_source_view_dispose (GObject *object)
g_clear_object (&priv->snippets_provider);
g_clear_object (&priv->css_provider);
g_clear_object (&priv->mode);
+ g_clear_object (&priv->buffer_signals);
if (priv->buffer)
{
@@ -5872,6 +5754,82 @@ ide_source_view_init (IdeSourceView *self)
priv->selections = g_queue_new ();
priv->show_line_diagnostics = TRUE;
+ priv->buffer_signals = egg_signal_group_new (IDE_TYPE_BUFFER);
+
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "changed",
+ G_CALLBACK (ide_source_view__buffer_changed_cb),
+ self,
+ G_CONNECT_SWAPPED);
+
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "line-flags-changed",
+ G_CALLBACK (ide_source_view__buffer_line_flags_changed_cb),
+ self,
+ G_CONNECT_SWAPPED);
+
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "notify::highlight-diagnostics",
+ G_CALLBACK (ide_source_view__buffer_notify_highlight_diagnostics_cb),
+ self,
+ G_CONNECT_SWAPPED);
+
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "notify::file",
+ G_CALLBACK (ide_source_view__buffer_notify_file_cb),
+ self,
+ G_CONNECT_SWAPPED);
+
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "notify::language",
+ G_CALLBACK (ide_source_view__buffer_notify_language_cb),
+ self,
+ G_CONNECT_SWAPPED);
+
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "notify::style-scheme",
+ G_CALLBACK (ide_source_view__buffer_notify_style_scheme_cb),
+ self,
+ G_CONNECT_SWAPPED);
+
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "insert-text",
+ G_CALLBACK (ide_source_view__buffer_insert_text_cb),
+ self,
+ G_CONNECT_SWAPPED);
+
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "insert-text",
+ G_CALLBACK (ide_source_view__buffer_insert_text_after_cb),
+ self,
+ G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "delete-range",
+ G_CALLBACK (ide_source_view__buffer_delete_range_cb),
+ self,
+ G_CONNECT_SWAPPED);
+
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "delete-range",
+ G_CALLBACK (ide_source_view__buffer_delete_range_after_cb),
+ self,
+ G_CONNECT_SWAPPED | G_CONNECT_AFTER);
+
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "mark-set",
+ G_CALLBACK (ide_source_view__buffer_mark_set_cb),
+ self,
+ G_CONNECT_SWAPPED);
+
+ egg_signal_group_connect_object (priv->buffer_signals,
+ "loaded",
+ G_CALLBACK (ide_source_view__buffer_loaded_cb),
+ self,
+ G_CONNECT_SWAPPED);
+
+ g_object_bind_property (self, "buffer", priv->buffer_signals, "target", 0);
+
g_signal_connect (self,
"notify::buffer",
G_CALLBACK (ide_source_view_notify_buffer),
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]