]> git.0d.be Git - empathy.git/commitdiff
Disconnect from notify::location
authorPierre-Luc Beaudoin <pierre-luc@pierlux.com>
Tue, 26 May 2009 22:12:09 +0000 (18:12 -0400)
committerPierre-Luc Beaudoin <pierre-luc@pierlux.com>
Wed, 27 May 2009 16:52:10 +0000 (12:52 -0400)
Since the list of EmpathyContact can change at anytime, it can't
be iterated to disconnect the handlers.  Instead, a ref is
added to the markers.

src/empathy-map-view.c

index 4173128cc32af22a3284ff6257662348c6d96573..83ad3924b69916b94cda5dfdf2d76311d7386407 100644 (file)
@@ -55,6 +55,7 @@ typedef struct {
   GtkWidget *zoom_out;
   ChamplainView *map_view;
   ChamplainLayer *layer;
+  GSList *notify_handles;
 } EmpathyMapView;
 
 static void map_view_destroy_cb (GtkWidget *widget,
@@ -148,7 +149,21 @@ static void
 map_view_destroy_cb (GtkWidget *widget,
     EmpathyMapView *window)
 {
-  GtkTreeModel *model;
+  GSList *item;
+
+  item = window->notify_handles;
+  while (item != NULL)
+  {
+    EmpathyContact *contact;
+    ChamplainMarker *marker;
+
+    marker = CHAMPLAIN_MARKER (item->data);
+    contact = g_object_get_data (G_OBJECT (marker), "contact");
+    g_signal_handlers_disconnect_by_func (contact, map_view_contact_location_notify, marker);
+    g_object_unref (marker);
+
+    item = g_slist_next (item);
+  }
 
   g_object_unref (window->list_store);
   g_object_unref (window->layer);
@@ -374,7 +389,9 @@ map_view_contacts_foreach (GtkTreeModel *model,
 
   g_signal_connect (contact, "notify::location",
       G_CALLBACK (map_view_contact_location_notify), marker);
-
+  g_object_set_data_full (G_OBJECT (marker), "contact", g_object_ref (contact), g_object_unref);
+  window->notify_handles = g_slist_append (window->notify_handles,
+      g_object_ref (marker));
 
   map_view_marker_update_position (CHAMPLAIN_MARKER (marker), contact);