[gnome-builder] minimap: use EggSignalGroup for buffer signals



commit 323781b345ee67654bcaee13677774ac1548589d
Author: Christian Hergert <christian hergert me>
Date:   Wed May 20 21:24:27 2015 -0700

    minimap: use EggSignalGroup for buffer signals
    
    We only have one at the moment, but I much prefer trusting EggSignalGroup
    to managed the weak refs than to do all of that machinery manually in
    callbacks.

 libide/ide-source-map.c |   83 +++++++++++++++++++++-------------------------
 1 files changed, 38 insertions(+), 45 deletions(-)
---
diff --git a/libide/ide-source-map.c b/libide/ide-source-map.c
index 2bad436..e8faab9 100644
--- a/libide/ide-source-map.c
+++ b/libide/ide-source-map.c
@@ -26,14 +26,14 @@
 #include "ide-source-map.h"
 #include "ide-source-view.h"
 
-#define CONCEAL_TIMEOUT      2000
+#define CONCEAL_TIMEOUT 2000
 
 struct _IdeSourceMap
 {
   GtkSourceMap               parent_instance;
 
-  EggSignalGroup            *signal_group;
-  GtkTextBuffer             *buffer;
+  EggSignalGroup            *view_signals;
+  EggSignalGroup            *buffer_signals;
   GtkSourceGutterRenderer   *line_renderer;
   guint                      delayed_conceal_timeout;
   guint                      show_map : 1;
@@ -168,26 +168,7 @@ ide_source_map__view_notify_buffer (IdeSourceMap  *self,
   g_assert (GTK_SOURCE_IS_VIEW (view));
 
   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
-  if (self->buffer != buffer)
-    {
-      if (self->buffer != NULL)
-        {
-          g_signal_handlers_disconnect_by_func (self->buffer,
-                                                G_CALLBACK (ide_source_map__buffer_line_flags_changed),
-                                                self);
-          ide_clear_weak_pointer (&self->buffer);
-        }
-
-      if (IDE_IS_BUFFER (buffer))
-        {
-          ide_set_weak_pointer (&self->buffer, buffer);
-          g_signal_connect_object (buffer,
-                                   "line-flags-changed",
-                                   G_CALLBACK (ide_source_map__buffer_line_flags_changed),
-                                   self,
-                                   G_CONNECT_SWAPPED);
-        }
-    }
+  egg_signal_group_set_target (self->buffer_signals, buffer);
 }
 
 static gboolean
@@ -223,7 +204,7 @@ ide_source_map__view_changed (IdeSourceMap *self,
   g_object_bind_property_full (view, "font-desc", self, "font-desc", G_BINDING_SYNC_CREATE,
                                shrink_font, NULL, NULL, NULL);
 
-  egg_signal_group_set_target (self->signal_group, view);
+  egg_signal_group_set_target (self->view_signals, view);
 }
 
 static void
@@ -237,8 +218,10 @@ ide_source_map_destroy (GtkWidget *widget)
       self->delayed_conceal_timeout = 0;
     }
 
-  ide_clear_weak_pointer (&self->buffer);
-  g_clear_object (&self->signal_group);
+  self->line_renderer = NULL;
+
+  g_clear_object (&self->view_signals);
+  g_clear_object (&self->buffer_signals);
 
   GTK_WIDGET_CLASS (ide_source_map_parent_class)->destroy (widget);
 }
@@ -276,55 +259,65 @@ static void
 ide_source_map_init (IdeSourceMap *self)
 {
   GtkSourceGutter *gutter;
-  GtkSourceView *child_view = gtk_source_map_get_child_view (GTK_SOURCE_MAP (self));
+  GtkSourceView *child_view;
 
-  gutter = gtk_source_view_get_gutter (child_view, GTK_TEXT_WINDOW_LEFT);
-  self->line_renderer = g_object_new (IDE_TYPE_LINE_CHANGE_GUTTER_RENDERER,
-                                      "size", 2,
-                                      "visible", TRUE,
-                                      NULL);
-  gtk_source_gutter_insert (gutter, self->line_renderer, 0);
+  /* Buffer */
+  self->buffer_signals = egg_signal_group_new (GTK_TYPE_TEXT_BUFFER);
+  egg_signal_group_connect_object (self->buffer_signals,
+                                   "line-flags-changed",
+                                   G_CALLBACK (ide_source_map__buffer_line_flags_changed),
+                                   self,
+                                   G_CONNECT_SWAPPED);
 
   /* View */
-  self->signal_group = egg_signal_group_new (GTK_SOURCE_TYPE_VIEW);
+  self->view_signals = egg_signal_group_new (GTK_SOURCE_TYPE_VIEW);
 
-  g_signal_connect_object (self,
-                           "notify::view",
-                           G_CALLBACK (ide_source_map__view_changed),
-                           self,
-                           G_CONNECT_SWAPPED);
-
-  egg_signal_group_connect_object (self->signal_group,
+  egg_signal_group_connect_object (self->view_signals,
                                    "notify::buffer",
                                    G_CALLBACK (ide_source_map__view_notify_buffer),
                                    self,
                                    G_CONNECT_SWAPPED);
 
-  egg_signal_group_connect_object (self->signal_group,
+  egg_signal_group_connect_object (self->view_signals,
                                    "enter-notify-event",
                                    G_CALLBACK (ide_source_map__enter_notify_event),
                                    self,
                                    G_CONNECT_SWAPPED);
 
-  egg_signal_group_connect_object (self->signal_group,
+  egg_signal_group_connect_object (self->view_signals,
                                    "leave-notify-event",
                                    G_CALLBACK (ide_source_map__leave_notify_event),
                                    self,
                                    G_CONNECT_SWAPPED);
 
-  egg_signal_group_connect_object (self->signal_group,
+  egg_signal_group_connect_object (self->view_signals,
                                    "motion-notify-event",
                                    G_CALLBACK (ide_source_map__motion_notify_event),
                                    self,
                                    G_CONNECT_SWAPPED);
 
-  egg_signal_group_connect_object (self->signal_group,
+  egg_signal_group_connect_object (self->view_signals,
                                    "scroll-event",
                                    G_CALLBACK (ide_source_map__scroll_event),
                                    self,
                                    G_CONNECT_SWAPPED);
 
+  g_signal_connect_object (self,
+                           "notify::view",
+                           G_CALLBACK (ide_source_map__view_changed),
+                           self,
+                           G_CONNECT_SWAPPED);
+
   /* Child view */
+  child_view = gtk_source_map_get_child_view (GTK_SOURCE_MAP (self));
+
+  gutter = gtk_source_view_get_gutter (child_view, GTK_TEXT_WINDOW_LEFT);
+  self->line_renderer = g_object_new (IDE_TYPE_LINE_CHANGE_GUTTER_RENDERER,
+                                      "size", 2,
+                                      "visible", TRUE,
+                                      NULL);
+  gtk_source_gutter_insert (gutter, self->line_renderer, 0);
+
   g_signal_connect_object (child_view,
                            "enter-notify-event",
                            G_CALLBACK (ide_source_map__enter_notify_event),


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]