]> git.0d.be Git - empathy.git/commitdiff
Disconnect signals on list and contacts when finalizing the store.
authorXavier Claessens <xclaesse@gmail.com>
Mon, 1 Oct 2007 11:42:48 +0000 (11:42 +0000)
committerXavier Claessens <xclaesse@src.gnome.org>
Mon, 1 Oct 2007 11:42:48 +0000 (11:42 +0000)
2007-10-01  Xavier Claessens  <xclaesse@gmail.com>

* libempathy-gtk/empathy-contact-list-store.c: Disconnect signals on
list and contacts when finalizing the store.

svn path=/trunk/; revision=345

ChangeLog
libempathy-gtk/empathy-contact-list-store.c

index 36f45346a8c572df16336ee14ebcf34e9037dcce..f748cdac6e56ea1c7812363580a6889bd6dce829 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2007-10-01  Xavier Claessens  <xclaesse@gmail.com>
+
+       * libempathy-gtk/empathy-contact-list-store.c: Disconnect signals on
+       list and contacts when finalizing the store.
+
 2007-10-01  Xavier Claessens  <xclaesse@gmail.com>
 
        * libempathy-gtk/empathy-contact-list-view.c:
index 81f50c8a690197c1fe8208d3dc66110d8e357a5e..6ca5c60a1c322f9c6059af7831e37ebc030f59ac 100644 (file)
@@ -93,6 +93,10 @@ static void             contact_list_store_set_property              (GObject
                                                                      guint                          param_id,
                                                                      const GValue                  *value,
                                                                      GParamSpec                    *pspec);
+static gboolean         contact_list_store_finalize_foreach          (GtkTreeModel                  *model,
+                                                                     GtkTreePath                   *path,
+                                                                     GtkTreeIter                   *iter,
+                                                                     gpointer                       user_data);
 static void             contact_list_store_setup                     (EmpathyContactListStore       *store);
 static gboolean         contact_list_store_inibit_active_cb          (EmpathyContactListStore       *store);
 static void             contact_list_store_members_changed_cb        (EmpathyContactList            *list_iface,
@@ -228,9 +232,17 @@ contact_list_store_finalize (GObject *object)
 
        priv = GET_PRIV (object);
 
-       /* FIXME: disconnect all signals on the list and contacts */
+       gtk_tree_model_foreach (GTK_TREE_MODEL (object),
+                               (GtkTreeModelForeachFunc) contact_list_store_finalize_foreach,
+                               object);
 
        if (priv->list) {
+               g_signal_handlers_disconnect_by_func (priv->list,
+                                                     G_CALLBACK (contact_list_store_members_changed_cb),
+                                                     object);
+               g_signal_handlers_disconnect_by_func (priv->list,
+                                                     G_CALLBACK (contact_list_store_groups_changed_cb),
+                                                     object);
                g_object_unref (priv->list);
        }
 
@@ -609,6 +621,28 @@ empathy_contact_list_store_search_equal_func (GtkTreeModel *model,
        return ret;
 }
 
+static gboolean
+contact_list_store_finalize_foreach (GtkTreeModel *model,
+                                    GtkTreePath  *path,
+                                    GtkTreeIter  *iter,
+                                    gpointer      user_data)
+{
+       EmpathyContactListStore *store = user_data;
+       EmpathyContact          *contact = NULL;
+
+       gtk_tree_model_get (GTK_TREE_MODEL (store), iter,
+                           COL_CONTACT, &contact,
+                           -1);
+
+       if (contact) {
+               g_signal_handlers_disconnect_by_func (contact,
+                                                     G_CALLBACK (contact_list_store_contact_updated_cb),
+                                                     store);
+       }
+
+       return FALSE;
+}
+
 static void
 contact_list_store_setup (EmpathyContactListStore *store)
 {