[balsa/wip/gtk4: 116/351] Cleanup some dispose and finalize methods



commit 6814a92e79c67775edeba3beb07f58af9b522c50
Author: Peter Bloomfield <PeterBloomfield bellsouth net>
Date:   Mon Jan 8 21:11:45 2018 -0500

    Cleanup some dispose and finalize methods

 libbalsa/address-book-extern.c   |    5 +--
 libbalsa/address-book-ldap.c     |   10 ++--
 libbalsa/address-book-osmo.c     |    8 ++--
 libbalsa/address-book-rubrica.c  |    9 +---
 libbalsa/address-book-text.c     |   10 +----
 libbalsa/address-book.c          |    3 -
 libbalsa/address-view.c          |    9 ++--
 libbalsa/address.c               |   16 +++----
 libbalsa/completion.c            |    3 +-
 libbalsa/gmime-filter-header.c   |   15 -------
 libbalsa/gmime-gpgme-signature.c |    2 -
 libbalsa/identity.c              |   15 ++++++-
 libbalsa/imap-server.c           |    3 +-
 libbalsa/libbalsa-vfs.c          |   24 ++++++++++-
 libbalsa/mailbox.c               |   76 +++++++++++++-------------------------
 libbalsa/mailbox_imap.c          |   53 +++++++++++++++-----------
 libbalsa/mailbox_local.c         |   43 ++++++++++-----------
 libbalsa/mailbox_mbox.c          |    2 +
 libbalsa/mailbox_pop3.c          |   11 ++---
 libbalsa/message.c               |   62 +++++++++++++-----------------
 libbalsa/misc.c                  |   14 +++++++
 libbalsa/misc.h                  |    2 +
 libbalsa/rfc2445.c               |    4 +-
 libbalsa/server.c                |   12 ++---
 libnetclient/net-client-pop.c    |   15 +++++++-
 libnetclient/net-client.c        |   15 +++++++-
 src/balsa-message.c              |   22 +++++++++--
 src/balsa-mime-widget.c          |   31 +---------------
 src/balsa-print-object-decor.c   |    6 +-
 src/balsa-print-object-default.c |   18 +++++++-
 src/balsa-print-object-header.c  |    6 +-
 src/balsa-print-object-image.c   |    8 ++--
 src/balsa-print-object-text.c    |    9 ++--
 src/balsa-print-object.c         |   11 -----
 src/filter-run-dialog.c          |    8 ++-
 src/mailbox-node.c               |   21 +++++-----
 src/main-window.c                |   16 +++-----
 src/sendmsg-window.c             |    6 +-
 src/toolbar-factory.c            |   14 ++++++-
 39 files changed, 308 insertions(+), 309 deletions(-)
---
diff --git a/libbalsa/address-book-extern.c b/libbalsa/address-book-extern.c
index 51ffa8e..9ee3ace 100644
--- a/libbalsa/address-book-extern.c
+++ b/libbalsa/address-book-extern.c
@@ -166,10 +166,7 @@ libbalsa_address_book_externq_finalize(GObject * object)
 
     g_free(addr_externq->load);
     g_free(addr_externq->save);
-       
-    g_list_foreach(addr_externq->address_list, (GFunc) g_object_unref, NULL);
-    g_list_free(addr_externq->address_list);
-    addr_externq->address_list = NULL;
+    g_list_free_full(addr_externq->address_list, g_object_unref);
 
     G_OBJECT_CLASS(parent_class)->finalize(object);
 }
diff --git a/libbalsa/address-book-ldap.c b/libbalsa/address-book-ldap.c
index a3d8748..b836d10 100644
--- a/libbalsa/address-book-ldap.c
+++ b/libbalsa/address-book-ldap.c
@@ -197,11 +197,11 @@ libbalsa_address_book_ldap_finalize(GObject * object)
 
     libbalsa_address_book_ldap_close_connection(addr_ldap);
 
-    g_free(addr_ldap->host);    addr_ldap->host = NULL;
-    g_free(addr_ldap->base_dn); addr_ldap->base_dn = NULL;
-    g_free(addr_ldap->bind_dn); addr_ldap->bind_dn = NULL;
-    g_free(addr_ldap->priv_book_dn); addr_ldap->priv_book_dn = NULL;
-    g_free(addr_ldap->passwd);  addr_ldap->passwd  = NULL;
+    g_free(addr_ldap->host);
+    g_free(addr_ldap->base_dn);
+    g_free(addr_ldap->bind_dn);
+    g_free(addr_ldap->priv_book_dn);
+    g_free(addr_ldap->passwd);
 
     G_OBJECT_CLASS(parent_class)->finalize(object);
 }
diff --git a/libbalsa/address-book-osmo.c b/libbalsa/address-book-osmo.c
index bee55da..0b00db8 100644
--- a/libbalsa/address-book-osmo.c
+++ b/libbalsa/address-book-osmo.c
@@ -49,7 +49,7 @@
 #define LOOKUP_MIN_LEN                                 2U
 
 
-static void libbalsa_address_book_osmo_finalize(GObject *object);
+static void libbalsa_address_book_osmo_dispose(GObject *object);
 static LibBalsaABErr libbalsa_address_book_osmo_load(LibBalsaAddressBook                *ab,
                                                      const gchar                                *filter,
                                                      LibBalsaAddressBookLoadFunc callback,
@@ -73,7 +73,7 @@ libbalsa_address_book_osmo_class_init(LibBalsaAddressBookOsmoClass *klass)
        object_class = G_OBJECT_CLASS(klass);
        address_book_class = LIBBALSA_ADDRESS_BOOK_CLASS(klass);
 
-       object_class->finalize = libbalsa_address_book_osmo_finalize;
+       object_class->dispose = libbalsa_address_book_osmo_dispose;
 
        address_book_class->load = libbalsa_address_book_osmo_load;
 #if defined(OSMO_CAN_WRITE)
@@ -94,14 +94,14 @@ libbalsa_address_book_osmo_init(LibBalsaAddressBookOsmo *ab)
 
 
 static void
-libbalsa_address_book_osmo_finalize(GObject *object)
+libbalsa_address_book_osmo_dispose(GObject *object)
 {
        LibBalsaAddressBookOsmo *osmo;
 
        osmo = LIBBALSA_ADDRESS_BOOK_OSMO(object);
         g_clear_object(&osmo->proxy);
 
-       G_OBJECT_CLASS(libbalsa_address_book_osmo_parent_class)->finalize(object);
+       G_OBJECT_CLASS(libbalsa_address_book_osmo_parent_class)->dispose(object);
 }
 
 
diff --git a/libbalsa/address-book-rubrica.c b/libbalsa/address-book-rubrica.c
index dded807..45fe627 100644
--- a/libbalsa/address-book-rubrica.c
+++ b/libbalsa/address-book-rubrica.c
@@ -142,12 +142,9 @@ libbalsa_address_book_rubrica_finalize(GObject * object)
 
     /* item_list is different from the default
      * LibBalsaAddressBookText::item_list, so we free it here. */
-    g_slist_foreach(ab_text->item_list, (GFunc) g_object_unref, NULL);
-    g_slist_free(ab_text->item_list);
-    ab_text->item_list = NULL;
+    g_slist_free_full(ab_text->item_list, g_object_unref);
 
-    (*G_OBJECT_CLASS(libbalsa_address_book_rubrica_parent_class)->
-     finalize) (object);
+    G_OBJECT_CLASS(libbalsa_address_book_rubrica_parent_class)->finalize(object);
 }
 
 /* Public method */
@@ -425,8 +422,6 @@ lbab_rubrica_load_xml(LibBalsaAddressBookRubrica * ab_rubrica,
     g_slist_free(ab_text->item_list);
     ab_text->item_list = NULL;
 
-    g_list_foreach(ab_text->name_complete->items,
-                  (GFunc) completion_data_free, NULL);
     libbalsa_completion_clear_items(ab_text->name_complete);
 
 
diff --git a/libbalsa/address-book-text.c b/libbalsa/address-book-text.c
index 04cf2f4..2c58acb 100644
--- a/libbalsa/address-book-text.c
+++ b/libbalsa/address-book-text.c
@@ -183,13 +183,7 @@ libbalsa_address_book_text_finalize(GObject * object)
     ab_text = LIBBALSA_ADDRESS_BOOK_TEXT(object);
 
     g_free(ab_text->path);
-
-    g_slist_foreach(ab_text->item_list, (GFunc) lbab_text_item_free, NULL);
-    g_slist_free(ab_text->item_list);
-    ab_text->item_list = NULL;
-
-    g_list_foreach(ab_text->name_complete->items,
-                   (GFunc) completion_data_free, NULL);
+    g_slist_free_full(ab_text->item_list, (GDestroyNotify) lbab_text_item_free);
     libbalsa_completion_free(ab_text->name_complete);
 
     G_OBJECT_CLASS(parent_class)->finalize(object);
@@ -308,8 +302,6 @@ lbab_text_load_file(LibBalsaAddressBookText * ab_text, FILE * stream)
     g_slist_free(ab_text->item_list);
     ab_text->item_list = NULL;
 
-    g_list_foreach(ab_text->name_complete->items,
-                   (GFunc) completion_data_free, NULL);
     libbalsa_completion_clear_items(ab_text->name_complete);
 
     parse_address =
diff --git a/libbalsa/address-book.c b/libbalsa/address-book.c
index c97ad3b..ce37e11 100644
--- a/libbalsa/address-book.c
+++ b/libbalsa/address-book.c
@@ -108,10 +108,7 @@ libbalsa_address_book_finalize(GObject * object)
     ab = LIBBALSA_ADDRESS_BOOK(object);
 
     g_free(ab->config_prefix);
-    ab->config_prefix = NULL;
-
     g_free(ab->name);
-    ab->name = NULL;
 
     G_OBJECT_CLASS(parent_class)->finalize(object);
 }
diff --git a/libbalsa/address-view.c b/libbalsa/address-view.c
index 5c775e7..0cd6966 100644
--- a/libbalsa/address-view.c
+++ b/libbalsa/address-view.c
@@ -101,14 +101,15 @@ libbalsa_address_view_finalize(GObject * object)
     g_free(address_view->domain);
     g_free(address_view->path_string);
 
-    if (address_view->focus_row)
+    if (address_view->focus_row != NULL) {
         gtk_tree_row_reference_free(address_view->focus_row);
+    }
 
-    if (address_view->focus_idle_id)
+    if (address_view->focus_idle_id != 0) {
         g_source_remove(address_view->focus_idle_id);
+    }
 
-    (*G_OBJECT_CLASS(libbalsa_address_view_parent_class)->
-     finalize) (object);
+    G_OBJECT_CLASS(libbalsa_address_view_parent_class)->finalize(object);
 }
 
 static void
diff --git a/libbalsa/address.c b/libbalsa/address.c
index f987b4a..698fe10 100644
--- a/libbalsa/address.c
+++ b/libbalsa/address.c
@@ -94,15 +94,13 @@ libbalsa_address_finalize(GObject * object)
 
     addr = LIBBALSA_ADDRESS(object);
 
-    g_free(addr->nick_name);    addr->nick_name = NULL;
-    g_free(addr->full_name);    addr->full_name = NULL;
-    g_free(addr->first_name);   addr->first_name = NULL;
-    g_free(addr->last_name);    addr->last_name = NULL;
-    g_free(addr->organization); addr->organization = NULL;
-
-    g_list_foreach(addr->address_list, (GFunc) g_free, NULL);
-    g_list_free(addr->address_list);
-    addr->address_list = NULL;
+    g_free(addr->nick_name);
+    g_free(addr->full_name);
+    g_free(addr->first_name);
+    g_free(addr->last_name);
+    g_free(addr->organization);
+
+    g_list_free_full(addr->address_list, g_free);
 
     G_OBJECT_CLASS(parent_class)->finalize(object);
 }
diff --git a/libbalsa/completion.c b/libbalsa/completion.c
index b50cc57..086190b 100644
--- a/libbalsa/completion.c
+++ b/libbalsa/completion.c
@@ -57,6 +57,7 @@
 
 #include <glib.h>
 #include "completion.h"
+#include "abook-completion.h"
 
 /**
  * SECTION: completion
@@ -193,7 +194,7 @@ libbalsa_completion_clear_items(LibBalsaCompletion * cmp)
 {
     g_return_if_fail(cmp != NULL);
 
-    g_list_free(cmp->items);
+    g_list_free_full(cmp->items, (GDestroyNotify) completion_data_free);
     cmp->items = NULL;
     g_list_free(cmp->cache);
     cmp->cache = NULL;
diff --git a/libbalsa/gmime-filter-header.c b/libbalsa/gmime-filter-header.c
index 3405d31..2568b5a 100644
--- a/libbalsa/gmime-filter-header.c
+++ b/libbalsa/gmime-filter-header.c
@@ -20,7 +20,6 @@
 #include "gmime-filter-header.h"
 
 static void g_mime_filter_header_class_init(GMimeFilterHeaderClass *klass);
-static void g_mime_filter_header_finalize(GObject *object);
 
 static GMimeFilter *filter_copy(GMimeFilter *filter);
 static void filter_filter(GMimeFilter *filter, char *in, size_t len, size_t prespace, char **out, size_t 
*outlen,
@@ -33,19 +32,11 @@ static void filter_reset(GMimeFilter *filter);
 G_DEFINE_TYPE(GMimeFilterHeader, g_mime_filter_header, GMIME_TYPE_FILTER)
 
 
-static GMimeFilterClass *parent_class = NULL;
-
-
 static void
 g_mime_filter_header_class_init(GMimeFilterHeaderClass *klass)
 {
-       GObjectClass *object_class = G_OBJECT_CLASS(klass);
        GMimeFilterClass *filter_class = GMIME_FILTER_CLASS(klass);
 
-       parent_class = g_type_class_ref(GMIME_TYPE_FILTER);
-
-       object_class->finalize = g_mime_filter_header_finalize;
-
        filter_class->copy = filter_copy;
        filter_class->filter = filter_filter;
        filter_class->complete = filter_complete;
@@ -59,12 +50,6 @@ g_mime_filter_header_init(GMimeFilterHeader *self)
        self->drop_header = FALSE;
 }
 
-static void
-g_mime_filter_header_finalize(GObject *object)
-{
-       G_OBJECT_CLASS(parent_class)->finalize(object);
-}
-
 static GMimeFilter *
 filter_copy(GMimeFilter *filter)
 {
diff --git a/libbalsa/gmime-gpgme-signature.c b/libbalsa/gmime-gpgme-signature.c
index 0d49aed..e09f6c1 100644
--- a/libbalsa/gmime-gpgme-signature.c
+++ b/libbalsa/gmime-gpgme-signature.c
@@ -130,10 +130,8 @@ static void
 g_mime_gpgme_sigstat_finalize(GMimeGpgmeSigstat * self)
 {
     g_free(self->fingerprint);
-    self->fingerprint = NULL;
     if (self->key)
        gpgme_key_unref(self->key);
-    self->key = NULL;
 
     g_mime_gpgme_sigstat_parent_class->finalize(G_OBJECT(self));
 }
diff --git a/libbalsa/identity.c b/libbalsa/identity.c
index 479913a..9b94b4b 100644
--- a/libbalsa/identity.c
+++ b/libbalsa/identity.c
@@ -49,6 +49,7 @@ static GObjectClass* parent_class;
 /* Forward references. */
 static void libbalsa_identity_class_init(LibBalsaIdentityClass* klass);
 static void libbalsa_identity_init(LibBalsaIdentity* ident);
+static void libbalsa_identity_dispose(GObject* object);
 static void libbalsa_identity_finalize(GObject* object);
 
 GType
@@ -86,6 +87,7 @@ libbalsa_identity_class_init(LibBalsaIdentityClass* klass)
     parent_class = g_type_class_peek_parent(klass);
 
     object_class = G_OBJECT_CLASS(klass);
+    object_class->dispose  = libbalsa_identity_dispose;
     object_class->finalize = libbalsa_identity_finalize;
 }
 
@@ -129,11 +131,21 @@ libbalsa_identity_init(LibBalsaIdentity* ident)
  * Destroy the object, freeing all the values in the process.
  */
 static void
-libbalsa_identity_finalize(GObject * object)
+libbalsa_identity_dispose(GObject * object)
 {
     LibBalsaIdentity *ident = LIBBALSA_IDENTITY(object);
 
     g_clear_object(&ident->ia);
+    g_clear_object(&ident->smtp_server);
+
+    G_OBJECT_CLASS(parent_class)->dispose(object);
+}
+
+static void
+libbalsa_identity_finalize(GObject * object)
+{
+    LibBalsaIdentity *ident = LIBBALSA_IDENTITY(object);
+
     g_free(ident->identity_name);
     g_free(ident->replyto);
     g_free(ident->domain);
@@ -141,7 +153,6 @@ libbalsa_identity_finalize(GObject * object)
     g_free(ident->reply_string);
     g_free(ident->forward_string);
     g_free(ident->signature_path);
-    g_clear_object(&ident->smtp_server);
     g_free(ident->face);
     g_free(ident->x_face);
     g_free(ident->force_gpg_key_id);
diff --git a/libbalsa/imap-server.c b/libbalsa/imap-server.c
index a4a3063..e8cc9f2 100644
--- a/libbalsa/imap-server.c
+++ b/libbalsa/imap-server.c
@@ -201,7 +201,6 @@ libbalsa_imap_server_init(LibBalsaImapServer * imap_server)
                               connection_cleanup, imap_server);
 }
 
-/* leave object in sane state (NULLified fields) */
 static void
 libbalsa_imap_server_finalize(GObject * object)
 {
@@ -219,7 +218,7 @@ libbalsa_imap_server_finalize(GObject * object)
 
     libbalsa_imap_server_force_disconnect(imap_server);
     g_mutex_clear(&imap_server->lock);
-    g_free(imap_server->key); imap_server->key = NULL;
+    g_free(imap_server->key);
 
     G_OBJECT_CLASS(parent_class)->finalize(object);
 }
diff --git a/libbalsa/libbalsa-vfs.c b/libbalsa/libbalsa-vfs.c
index bdd6344..7275c1b 100644
--- a/libbalsa/libbalsa-vfs.c
+++ b/libbalsa/libbalsa-vfs.c
@@ -66,6 +66,7 @@ static GObjectClass *libbalsa_vfs_parent_class = NULL;
 
 static void libbalsa_vfs_class_init(LibbalsaVfsClass * klass);
 static void libbalsa_vfs_init(LibbalsaVfs * self);
+static void libbalsa_vfs_dispose(LibbalsaVfs * self);
 static void libbalsa_vfs_finalize(LibbalsaVfs * self);
 
 
@@ -110,6 +111,8 @@ libbalsa_vfs_class_init(LibbalsaVfsClass * klass)
     GObjectClass *gobject_klass = G_OBJECT_CLASS(klass);
 
     libbalsa_vfs_parent_class = g_type_class_peek(G_TYPE_OBJECT);
+    gobject_klass->dispose =
+        (GObjectFinalizeFunc) libbalsa_vfs_dispose;
     gobject_klass->finalize =
         (GObjectFinalizeFunc) libbalsa_vfs_finalize;
 }
@@ -123,6 +126,23 @@ libbalsa_vfs_init(LibbalsaVfs * self)
 
 
 static void
+libbalsa_vfs_dispose(LibbalsaVfs * self)
+{
+    struct _LibbalsaVfsPriv * priv;
+
+    g_return_if_fail(self != NULL);
+    priv = self->priv;
+
+    if (priv != NULL) {
+        g_clear_object(&priv->gio_gfile);
+        g_clear_object(&priv->info);
+    }
+
+    libbalsa_vfs_parent_class->dispose(G_OBJECT(self));
+}
+
+
+static void
 libbalsa_vfs_finalize(LibbalsaVfs * self)
 {
     struct _LibbalsaVfsPriv * priv;
@@ -130,14 +150,12 @@ libbalsa_vfs_finalize(LibbalsaVfs * self)
     g_return_if_fail(self != NULL);
     priv = self->priv;
 
-    if (priv) {
+    if (priv != NULL) {
         g_free(priv->file_uri);
         g_free(priv->file_utf8);
         g_free(priv->folder_uri);
         g_free(priv->mime_type);
         g_free(priv->charset);
-        g_clear_object(&priv->gio_gfile);
-        g_clear_object(&priv->info);
         g_free(priv);
     }
 
diff --git a/libbalsa/mailbox.c b/libbalsa/mailbox.c
index 778c148..c1e217b 100644
--- a/libbalsa/mailbox.c
+++ b/libbalsa/mailbox.c
@@ -266,6 +266,10 @@ libbalsa_mailbox_init(LibBalsaMailbox * mailbox)
  * called just before finalize, when ref_count is about to be
  * decremented to 0
  */
+
+static void lbm_get_index_entry_expunged_cb(LibBalsaMailbox * mailbox, guint seqno);
+static void lbm_msgno_changed_expunged_cb(LibBalsaMailbox * mailbox, guint seqno);
+
 static void
 libbalsa_mailbox_dispose(GObject * object)
 {
@@ -274,6 +278,26 @@ libbalsa_mailbox_dispose(GObject * object)
     while (mailbox->open_ref > 0)
         libbalsa_mailbox_close(mailbox, FALSE);
 
+    if (mailbox->msgnos_pending != NULL) {
+        g_signal_handlers_disconnect_by_func(mailbox,
+                                             lbm_get_index_entry_expunged_cb,
+                                             mailbox->msgnos_pending);
+        g_array_free(mailbox->msgnos_pending, TRUE);
+        mailbox->msgnos_pending = NULL;
+    }
+
+    if (mailbox->msgnos_changed != NULL) {
+        g_signal_handlers_disconnect_by_func(mailbox,
+                                             lbm_msgno_changed_expunged_cb,
+                                             mailbox->msgnos_changed);
+        g_array_free(mailbox->msgnos_changed, TRUE);
+        mailbox->msgnos_changed = NULL;
+    }
+
+    libbalsa_clear_source_id(&mailbox->changed_idle_id);
+    libbalsa_clear_source_id(&mailbox->queue_check_idle_id);
+    libbalsa_clear_source_id(&mailbox->need_threading_idle_id);
+
     G_OBJECT_CLASS(parent_class)->dispose(object);
 }
 
@@ -419,14 +443,9 @@ libbalsa_mailbox_index_set_flags(LibBalsaMailbox *mailbox,
 }
 
 /* libbalsa_mailbox_finalize:
-   destroys mailbox. Must leave it in sane state.
+   destroys mailbox.
 */
 
-static void lbm_msgno_changed_expunged_cb(LibBalsaMailbox * mailbox,
-                                          guint seqno);
-static void lbm_get_index_entry_expunged_cb(LibBalsaMailbox * mailbox,
-                                            guint seqno);
-
 static void
 libbalsa_mailbox_finalize(GObject * object)
 {
@@ -437,58 +456,15 @@ libbalsa_mailbox_finalize(GObject * object)
     mailbox = LIBBALSA_MAILBOX(object);
 
     g_free(mailbox->config_prefix);
-    mailbox->config_prefix = NULL;
-
     g_free(mailbox->name);
-    mailbox->name = NULL;
-
     g_free(mailbox->url);
-    mailbox->url = NULL;
 
     libbalsa_condition_unref(mailbox->view_filter);
-    mailbox->view_filter = NULL;
-
     libbalsa_condition_unref(mailbox->persistent_view_filter);
-    mailbox->persistent_view_filter = NULL;
 
-    g_slist_foreach(mailbox->filters, (GFunc) g_free, NULL);
-    g_slist_free(mailbox->filters);
-    mailbox->filters = NULL;
-    mailbox->filters_loaded = FALSE;
-
-    if (mailbox->msgnos_pending) {
-        g_signal_handlers_disconnect_by_func(mailbox,
-                                             lbm_get_index_entry_expunged_cb,
-                                             mailbox->msgnos_pending);
-        g_array_free(mailbox->msgnos_pending, TRUE);
-        mailbox->msgnos_pending = NULL;
-    }
-
-    if (mailbox->msgnos_changed) {
-        g_signal_handlers_disconnect_by_func(mailbox,
-                                             lbm_msgno_changed_expunged_cb,
-                                             mailbox->msgnos_changed);
-        g_array_free(mailbox->msgnos_changed, TRUE);
-        mailbox->msgnos_changed = NULL;
-    }
+    g_slist_free_full(mailbox->filters, g_free);
 
     libbalsa_mailbox_view_free(mailbox->view);
-    mailbox->view = NULL;
-
-    if (mailbox->changed_idle_id) {
-        g_source_remove(mailbox->changed_idle_id);
-        mailbox->changed_idle_id = 0;
-    }
-
-    if (mailbox->queue_check_idle_id) {
-        g_source_remove(mailbox->queue_check_idle_id);
-        mailbox->queue_check_idle_id = 0;
-    }
-
-    if (mailbox->need_threading_idle_id) {
-        g_source_remove(mailbox->need_threading_idle_id);
-        mailbox->need_threading_idle_id = 0;
-    }
 
     G_OBJECT_CLASS(parent_class)->finalize(object);
 }
diff --git a/libbalsa/mailbox_imap.c b/libbalsa/mailbox_imap.c
index 910498a..397022c 100644
--- a/libbalsa/mailbox_imap.c
+++ b/libbalsa/mailbox_imap.c
@@ -96,6 +96,7 @@ static off_t ImapCacheSize = 30*1024*1024; /* 30MB */
 
  /* issue message if downloaded part has more than this size */
 static unsigned SizeMsgThreshold = 50*1024;
+static void libbalsa_mailbox_imap_dispose(GObject * object);
 static void libbalsa_mailbox_imap_finalize(GObject * object);
 static void libbalsa_mailbox_imap_class_init(LibBalsaMailboxImapClass *
                                             klass);
@@ -241,6 +242,7 @@ libbalsa_mailbox_imap_class_init(LibBalsaMailboxImapClass * klass)
 
     parent_class = g_type_class_peek_parent(klass);
 
+    object_class->dispose  = libbalsa_mailbox_imap_dispose;
     object_class->finalize = libbalsa_mailbox_imap_finalize;
 
     libbalsa_mailbox_class->open_mailbox = libbalsa_mailbox_imap_open;
@@ -301,6 +303,30 @@ libbalsa_mailbox_imap_init(LibBalsaMailboxImap * mailbox)
     mailbox->sort_field = -1;  /* Initially invalid. */
 }
 
+static void
+libbalsa_mailbox_imap_dispose(GObject * object)
+{
+    LibBalsaMailboxRemote *remote;
+    LibBalsaMailboxImap *mailbox;
+
+    remote = LIBBALSA_MAILBOX_REMOTE(object);
+    if (remote->server != NULL) {
+        g_signal_handlers_disconnect_matched(remote->server,
+                                             G_SIGNAL_MATCH_DATA, 0,
+                                             (GQuark) 0, NULL, NULL,
+                                             remote);
+       g_clear_object(&remote->server);
+    }
+
+    mailbox = LIBBALSA_MAILBOX_IMAP(object);
+    if (mailbox->unread_update_id != 0) {
+        g_source_remove(mailbox->unread_update_id);
+        mailbox->unread_update_id = 0;
+    }
+
+    G_OBJECT_CLASS(parent_class)->dispose(object);
+}
+
 /* libbalsa_mailbox_imap_finalize:
    NOTE: we have to close mailbox ourselves without waiting for
    LibBalsaMailbox::finalize because we want to destroy server as well,
@@ -310,7 +336,6 @@ static void
 libbalsa_mailbox_imap_finalize(GObject * object)
 {
     LibBalsaMailboxImap *mailbox;
-    LibBalsaMailboxRemote *remote;
 
     g_return_if_fail(LIBBALSA_IS_MAILBOX_IMAP(object));
 
@@ -318,29 +343,11 @@ libbalsa_mailbox_imap_finalize(GObject * object)
 
     g_assert(LIBBALSA_MAILBOX(mailbox)->open_ref == 0);
 
-    remote = LIBBALSA_MAILBOX_REMOTE(object);
-    g_free(mailbox->path); mailbox->path = NULL;
-
-    if(remote->server) {
-        g_signal_handlers_disconnect_matched(remote->server,
-                                             G_SIGNAL_MATCH_DATA, 0,
-                                             (GQuark) 0, NULL, NULL,
-                                             remote);
-       g_object_unref(G_OBJECT(remote->server));
-       remote->server = NULL;
-    }
-
-    g_array_free(mailbox->sort_ranks, TRUE); mailbox->sort_ranks = NULL;
-    if(mailbox->unread_update_id) {
-        g_source_remove(mailbox->unread_update_id);
-        mailbox->unread_update_id = 0;
-    }
-
-    g_list_foreach(mailbox->acls, (GFunc)imap_user_acl_free, NULL);
-    g_list_free(mailbox->acls);
+    g_free(mailbox->path);
+    g_array_free(mailbox->sort_ranks, TRUE);
+    g_list_free_full(mailbox->acls, (GDestroyNotify) imap_user_acl_free);
 
-    if (G_OBJECT_CLASS(parent_class)->finalize)
-       G_OBJECT_CLASS(parent_class)->finalize(object);
+    G_OBJECT_CLASS(parent_class)->finalize(object);
 }
 
 LibBalsaMailbox*
diff --git a/libbalsa/mailbox_local.c b/libbalsa/mailbox_local.c
index 82abbd1..070c9ea 100644
--- a/libbalsa/mailbox_local.c
+++ b/libbalsa/mailbox_local.c
@@ -41,6 +41,7 @@ static LibBalsaMailboxClass *parent_class = NULL;
 
 static void libbalsa_mailbox_local_class_init(LibBalsaMailboxLocalClass *klass);
 static void libbalsa_mailbox_local_init(LibBalsaMailboxLocal * mailbox);
+static void libbalsa_mailbox_local_dispose(GObject * object);
 static void libbalsa_mailbox_local_finalize(GObject * object);
 
 static void libbalsa_mailbox_local_changed(LibBalsaMailbox * mailbox);
@@ -148,6 +149,7 @@ libbalsa_mailbox_local_class_init(LibBalsaMailboxLocalClass * klass)
 
     parent_class = g_type_class_peek_parent(klass);
 
+    object_class->dispose  = libbalsa_mailbox_local_dispose;
     object_class->finalize = libbalsa_mailbox_local_finalize;
 
     libbalsa_mailbox_class->changed =
@@ -381,44 +383,41 @@ lbm_local_free_info(LibBalsaMailboxLocalInfo * info)
 }
 
 static void
-libbalsa_mailbox_local_finalize(GObject * object)
+libbalsa_mailbox_local_dispose(GObject * object)
 {
     LibBalsaMailboxLocal *ml;
 
     g_return_if_fail(LIBBALSA_IS_MAILBOX_LOCAL(object));
 
     ml = LIBBALSA_MAILBOX_LOCAL(object);
-    if(ml->sync_id) {
-        g_source_remove(ml->sync_id);
-        ml->sync_id = 0;
-    }
 
-    if(ml->thread_id) {
-        g_source_remove(ml->thread_id);
-        ml->thread_id = 0;
-    }
+    libbalsa_clear_source_id(&ml->sync_id);
+    libbalsa_clear_source_id(&ml->thread_id);
+    libbalsa_clear_source_id(&ml->save_tree_id);
+    libbalsa_clear_source_id(&ml->load_messages_id);
 
-    if(ml->save_tree_id) {
-        g_source_remove(ml->save_tree_id);
-        ml->save_tree_id = 0;
-    }
+    G_OBJECT_CLASS(parent_class)->dispose(object);
+}
 
-    if (ml->threading_info) {
+static void
+libbalsa_mailbox_local_finalize(GObject * object)
+{
+    LibBalsaMailboxLocal *ml;
+
+    g_return_if_fail(LIBBALSA_IS_MAILBOX_LOCAL(object));
+
+    ml = LIBBALSA_MAILBOX_LOCAL(object);
+
+    if (ml->threading_info != NULL) {
        /* The memory owned by ml->threading_info was freed on closing,
         * so we free only the array itself. */
        g_ptr_array_free(ml->threading_info, TRUE);
-       ml->threading_info = NULL;
-    }
-
-    if (ml->load_messages_id) {
-        g_source_remove(ml->load_messages_id);
-        ml->load_messages_id = 0;
     }
 
-    if (G_OBJECT_CLASS(parent_class)->finalize)
-       G_OBJECT_CLASS(parent_class)->finalize(object);
+    G_OBJECT_CLASS(parent_class)->finalize(object);
 }
 
+
 static void lbm_local_queue_save_tree(LibBalsaMailboxLocal * local);
 
 static void
diff --git a/libbalsa/mailbox_mbox.c b/libbalsa/mailbox_mbox.c
index ff5ecbb..315a085 100644
--- a/libbalsa/mailbox_mbox.c
+++ b/libbalsa/mailbox_mbox.c
@@ -184,6 +184,8 @@ libbalsa_mailbox_mbox_dispose(GObject * object)
 {
     if(MAILBOX_OPEN(LIBBALSA_MAILBOX(object)))
        libbalsa_mailbox_mbox_close_mailbox(LIBBALSA_MAILBOX(object), FALSE);
+
+    G_OBJECT_CLASS(parent_class)->dispose(object);
 }
 
 static gint
diff --git a/libbalsa/mailbox_pop3.c b/libbalsa/mailbox_pop3.c
index 199a7da..ae97e46 100644
--- a/libbalsa/mailbox_pop3.c
+++ b/libbalsa/mailbox_pop3.c
@@ -48,7 +48,7 @@ struct _LibBalsaMailboxPop3Class {
     void (*config_changed) (LibBalsaMailboxPop3* mailbox);
 };
 
-static void libbalsa_mailbox_pop3_finalize(GObject * object);
+static void libbalsa_mailbox_pop3_dispose(GObject * object);
 static void libbalsa_mailbox_pop3_class_init(LibBalsaMailboxPop3Class *
                                             klass);
 static void libbalsa_mailbox_pop3_init(LibBalsaMailboxPop3 * mailbox);
@@ -104,7 +104,7 @@ libbalsa_mailbox_pop3_class_init(LibBalsaMailboxPop3Class * klass)
 
     parent_class = g_type_class_peek_parent(klass);
 
-    object_class->finalize = libbalsa_mailbox_pop3_finalize;
+    object_class->dispose = libbalsa_mailbox_pop3_dispose;
 
     libbalsa_mailbox_class->open_mailbox = libbalsa_mailbox_pop3_open;
     libbalsa_mailbox_class->check = libbalsa_mailbox_pop3_check;
@@ -132,14 +132,13 @@ libbalsa_mailbox_pop3_init(LibBalsaMailboxPop3 * mailbox)
 }
 
 static void
-libbalsa_mailbox_pop3_finalize(GObject * object)
+libbalsa_mailbox_pop3_dispose(GObject * object)
 {
     LibBalsaMailboxRemote *remote = LIBBALSA_MAILBOX_REMOTE(object);
 
-    g_object_unref(G_OBJECT(remote->server));
+    g_clear_object(&remote->server);
 
-    if (G_OBJECT_CLASS(parent_class)->finalize)
-       G_OBJECT_CLASS(parent_class)->finalize(object);
+    G_OBJECT_CLASS(parent_class)->dispose(object);
 }
 
 LibBalsaMailboxPop3*
diff --git a/libbalsa/message.c b/libbalsa/message.c
index 4f068f1..cdf7da2 100644
--- a/libbalsa/message.c
+++ b/libbalsa/message.c
@@ -52,6 +52,7 @@
 static void libbalsa_message_class_init(LibBalsaMessageClass * klass);
 static void libbalsa_message_init(LibBalsaMessage * message);
 
+static void libbalsa_message_dispose(GObject * object);
 static void libbalsa_message_finalize(GObject * object);
 
 
@@ -113,6 +114,7 @@ libbalsa_message_class_init(LibBalsaMessageClass * klass)
 
     parent_class = g_type_class_peek_parent(klass);
 
+    object_class->dispose = libbalsa_message_dispose;
     object_class->finalize = libbalsa_message_finalize;
 }
 
@@ -126,62 +128,52 @@ libbalsa_message_new(void)
     return message;
 }
 
+/*
+ * libbalsa_message_dispose: must leave object in a sane state
+ */
+static void
+libbalsa_message_dispose(GObject * object)
+{
+    LibBalsaMessage *message;
+
+    message = LIBBALSA_MESSAGE(object);
+
+    g_clear_object(&message->sender);
+    g_clear_object(&message->mime_msg);
+#ifdef HAVE_GPGME
+    g_clear_object(&message->ident);
+#endif
+
+    G_OBJECT_CLASS(parent_class)->dispose(object);
+}
+
+
 /* libbalsa_message_finalize:
-   finalize methods must leave object in 'sane' state. 
-   This means NULLifing released pointers.
 */
 static void
 libbalsa_message_finalize(GObject * object)
 {
     LibBalsaMessage *message;
 
-    g_return_if_fail(object != NULL);
-    g_return_if_fail(LIBBALSA_IS_MESSAGE(object));
-
     message = LIBBALSA_MESSAGE(object);
 
-    libbalsa_message_headers_destroy(message->headers);
-    message->headers = NULL;
-
-    g_clear_object(&message->sender);
-
 #if MESSAGE_COPY_CONTENT
     g_free(message->subj);
-    message->subj = NULL;
 #endif
-    g_list_foreach(message->references, (GFunc) g_free, NULL);
-    g_list_free(message->references);
-    message->references = NULL;
-
-    g_list_foreach(message->in_reply_to, (GFunc) g_free, NULL);
-    g_list_free(message->in_reply_to);
-    message->in_reply_to = NULL;
-
     g_free(message->message_id);
-    message->message_id = NULL;
-
     g_free(message->subtype);
-    message->subtype = NULL;
-
-    g_list_foreach(message->parameters, (GFunc) g_strfreev, NULL);
-    g_list_free(message->parameters);
-    message->parameters = NULL;
 
+    g_list_free_full(message->references, g_free);
+    g_list_free_full(message->in_reply_to, g_free);
+    g_list_free_full(message->parameters, (GDestroyNotify) g_strfreev);
 
+    libbalsa_message_headers_destroy(message->headers);
     libbalsa_message_body_free(message->body_list);
-    message->body_list = NULL;
-
-    g_clear_object(&message->mime_msg);
-
-#ifdef HAVE_GPGME
-    g_clear_object(&message->ident);
-#endif
 
     if (message->tempdir) {
-        if (rmdir(message->tempdir))
+        if (rmdir(message->tempdir) != 0)
             g_warning("Could not remove %s", message->tempdir);
         g_free(message->tempdir);
-        message->tempdir = NULL;
     }
 
     G_OBJECT_CLASS(parent_class)->finalize(object);
diff --git a/libbalsa/misc.c b/libbalsa/misc.c
index 956ed0b..41f23e5 100644
--- a/libbalsa/misc.c
+++ b/libbalsa/misc.c
@@ -1210,3 +1210,17 @@ libbalsa_font_string_to_css(const gchar * font_string,
 
     return g_string_free(string, FALSE);
 }
+
+/*
+ * Convenience function for removing and clearing a GSource id
+ */
+void
+libbalsa_clear_source_id(guint * tag)
+{
+    g_return_if_fail(tag != NULL);
+
+    if (*tag != 0) {
+        g_source_remove(*tag);
+        *tag = 0;
+    }
+}
diff --git a/libbalsa/misc.h b/libbalsa/misc.h
index b2639e6..ac02514 100644
--- a/libbalsa/misc.h
+++ b/libbalsa/misc.h
@@ -158,4 +158,6 @@ gchar * libbalsa_text_to_html(const gchar * title, const gchar * body, const gch
 GString * libbalsa_html_encode_hyperlinks(GString * paragraph);
 gchar *libbalsa_font_string_to_css(const gchar * font_string, const gchar * name);
 
+void libbalsa_clear_source_id(guint * tag);
+
 #endif                         /* __LIBBALSA_MISC_H__ */
diff --git a/libbalsa/rfc2445.c b/libbalsa/rfc2445.c
index 603cb7a..cfa5f10 100644
--- a/libbalsa/rfc2445.c
+++ b/libbalsa/rfc2445.c
@@ -147,9 +147,9 @@ static void
 libbalsa_vcal_finalize(LibBalsaVCal * self)
 {
     g_return_if_fail(self != NULL);
+
     if (self->vevent) {
-       g_list_foreach(self->vevent, (GFunc) g_object_unref, NULL);
-       g_list_free(self->vevent);
+       g_list_free_full(self->vevent, g_object_unref);
     }
 
     libbalsa_vcal_parent_class->finalize(G_OBJECT(self));
diff --git a/libbalsa/server.c b/libbalsa/server.c
index 7b62f25..ebf49d7 100644
--- a/libbalsa/server.c
+++ b/libbalsa/server.c
@@ -171,7 +171,6 @@ libbalsa_server_init(LibBalsaServer * server)
     server->security           = NET_CLIENT_CRYPT_STARTTLS;
 }
 
-/* leave object in sane state (NULLified fields) */
 static void
 libbalsa_server_finalize(GObject * object)
 {
@@ -181,20 +180,19 @@ libbalsa_server_finalize(GObject * object)
 
     server = LIBBALSA_SERVER(object);
 
-    g_free(server->host);   server->host = NULL;
-    g_free(server->user);   server->user = NULL;
+    g_free(server->host);
+    g_free(server->user);
+    g_free(server->cert_file);
+
     if (server->passwd != NULL) {
        memset(server->passwd, 0, strlen(server->passwd));
     }
-    libbalsa_free_password(server->passwd); server->passwd = NULL;
+    libbalsa_free_password(server->passwd);
 
-    g_free(server->cert_file);
-    server->cert_file = NULL;
     if (server->cert_passphrase != NULL) {
        memset(server->cert_passphrase, 0, strlen(server->cert_passphrase));
     }
     g_free(server->cert_passphrase);
-    server->cert_passphrase = NULL;
 
     G_OBJECT_CLASS(parent_class)->finalize(object);
 }
diff --git a/libnetclient/net-client-pop.c b/libnetclient/net-client-pop.c
index 9d0a512..8741d8d 100644
--- a/libnetclient/net-client-pop.c
+++ b/libnetclient/net-client-pop.c
@@ -47,6 +47,7 @@ struct _NetClientPopPrivate {
 G_DEFINE_TYPE(NetClientPop, net_client_pop, NET_CLIENT_TYPE)
 
 
+static void net_client_pop_dispose(GObject *object);
 static void net_client_pop_finalise(GObject *object);
 static void net_client_pop_get_capa(NetClientPop *client, guint *auth_supported);
 static gboolean net_client_pop_read_reply(NetClientPop *client, gchar **reply, GError **error);
@@ -374,6 +375,7 @@ net_client_pop_class_init(NetClientPopClass *klass)
 {
        GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
 
+       gobject_class->dispose = net_client_pop_dispose;
        gobject_class->finalize = net_client_pop_finalise;
 }
 
@@ -388,7 +390,7 @@ net_client_pop_init(NetClientPop *self)
 
 
 static void
-net_client_pop_finalise(GObject *object)
+net_client_pop_dispose(GObject *object)
 {
        const NetClientPop *client = NET_CLIENT_POP(object);
        const GObjectClass *parent_class = G_OBJECT_CLASS(net_client_pop_parent_class);
@@ -396,10 +398,21 @@ net_client_pop_finalise(GObject *object)
        /* send the 'QUIT' command - no need to evaluate the reply or check for errors */
        (void) net_client_execute(NET_CLIENT(client), NULL, "QUIT", NULL);
 
+       (*parent_class->dispose)(object);
+}
+
+
+static void
+net_client_pop_finalise(GObject *object)
+{
+       const NetClientPop *client = NET_CLIENT_POP(object);
+       const GObjectClass *parent_class = G_OBJECT_CLASS(net_client_pop_parent_class);
+
        if (client->priv != NULL) {
                g_free(client->priv->apop_banner);
                g_free(client->priv);
        }
+
        (*parent_class->finalize)(object);
 }
 
diff --git a/libnetclient/net-client.c b/libnetclient/net-client.c
index 78f2455..1332c47 100644
--- a/libnetclient/net-client.c
+++ b/libnetclient/net-client.c
@@ -39,6 +39,7 @@ static guint signals[3];
 G_DEFINE_TYPE(NetClient, net_client, G_TYPE_OBJECT)
 
 
+static void net_client_dispose(GObject *object);
 static void net_client_finalise(GObject *object);
 static gboolean cert_accept_cb(GTlsConnection *conn, GTlsCertificate *peer_cert, GTlsCertificateFlags 
errors, gpointer user_data);
 
@@ -453,6 +454,7 @@ net_client_class_init(NetClientClass *klass)
        GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
 
        g_type_class_add_private(klass, sizeof(NetClientPrivate));
+       gobject_class->dispose = net_client_dispose;
        gobject_class->finalize = net_client_finalise;
        signals[0] = g_signal_new("cert-check", NET_CLIENT_TYPE, G_SIGNAL_RUN_LAST, 0U, NULL, NULL, NULL, 
G_TYPE_BOOLEAN, 2U,
                G_TYPE_TLS_CERTIFICATE, G_TYPE_TLS_CERTIFICATE_FLAGS);
@@ -474,7 +476,7 @@ net_client_init(NetClient *self)
 
 
 static void
-net_client_finalise(GObject *object)
+net_client_dispose(GObject *object)
 {
        const NetClient *client = NET_CLIENT(object);
        const GObjectClass *parent_class = G_OBJECT_CLASS(net_client_parent_class);
@@ -486,6 +488,17 @@ net_client_finalise(GObject *object)
         g_clear_object(&client->priv->plain_conn);
         g_clear_object(&client->priv->sock);
         g_clear_object(&client->priv->certificate);
+
+       (*parent_class->dispose)(object);
+}
+
+
+static void
+net_client_finalise(GObject *object)
+{
+       const NetClient *client = NET_CLIENT(object);
+       const GObjectClass *parent_class = G_OBJECT_CLASS(net_client_parent_class);
+
        g_debug("finalised connection to %s", client->priv->host_and_port);
        g_free(client->priv->host_and_port);
        (*parent_class->finalize)(object);
diff --git a/src/balsa-message.c b/src/balsa-message.c
index e833ba8..0025793 100644
--- a/src/balsa-message.c
+++ b/src/balsa-message.c
@@ -153,6 +153,7 @@ static void mdn_dialog_response(GtkWidget * dialog, gint response,
 
 static void balsa_part_info_init(GObject *object, gpointer data);
 static BalsaPartInfo* balsa_part_info_new(LibBalsaMessageBody* body);
+static void balsa_part_info_dispose(GObject * object);
 static void balsa_part_info_finalize(GObject * object);
 
 
@@ -165,12 +166,16 @@ static GdkPixbuf * get_crypto_content_icon(LibBalsaMessageBody * body,
 static void message_recheck_crypto_cb(GtkWidget * button, BalsaMessage * bm);
 #endif /* HAVE_GPGME */
 
+static GObjectClass *part_info_parent_class;
 
 static void
 balsa_part_info_class_init(BalsaPartInfoClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS(klass);
 
+    part_info_parent_class = g_type_class_peek_parent(object_class);
+
+    object_class->dispose  = balsa_part_info_dispose;
     object_class->finalize = balsa_part_info_finalize;
 }
 
@@ -814,6 +819,7 @@ balsa_message_destroy(GObject * object)
 
     g_clear_object(&bm->save_all_popup);
     g_clear_object(&bm->parts_popup);
+    g_clear_object(&bm->bm_widget);
 
 #ifdef HAVE_HTML_WIDGET
     g_clear_object(&bm->html_find_info);
@@ -1665,20 +1671,28 @@ balsa_part_info_new(LibBalsaMessageBody* body)
 }
 
 static void
+balsa_part_info_dispose(GObject * object)
+{
+    BalsaPartInfo * info;
+
+    info = BALSA_PART_INFO(object);
+    g_clear_object(&info->mime_widget);
+    g_clear_object(&info->popup_menu);
+
+    part_info_parent_class->dispose(object);
+}
+
+static void
 balsa_part_info_finalize(GObject * object)
 {
     BalsaPartInfo * info;
-    GObjectClass *part_info_parent_class;
 
     g_return_if_fail(object != NULL);
     g_return_if_fail(IS_BALSA_PART_INFO(object));
     info = BALSA_PART_INFO(object);
 
-    g_clear_object(&info->mime_widget);
-    g_clear_object(&info->popup_menu);
     gtk_tree_path_free(info->path);
 
-    part_info_parent_class = g_type_class_peek_parent(G_OBJECT_GET_CLASS(object));
     part_info_parent_class->finalize(object);
 }
 
diff --git a/src/balsa-mime-widget.c b/src/balsa-mime-widget.c
index 7ca7172..efeba1f 100644
--- a/src/balsa-mime-widget.c
+++ b/src/balsa-mime-widget.c
@@ -38,8 +38,6 @@
 
 /* object related functions */
 static void balsa_mime_widget_init (GTypeInstance *instance, gpointer g_class);
-static void balsa_mime_widget_class_init(BalsaMimeWidgetClass * klass);
-static void balsa_mime_widget_finalize(GObject * object);
 
 
 /* fall-back widget (unknown/unsupported mime type) */
@@ -52,9 +50,6 @@ static BalsaMimeWidget *balsa_mime_widget_new_unknown(BalsaMessage * bm,
 static void vadj_change_cb(GtkAdjustment *vadj, GtkWidget *widget);
 
 
-static GObjectClass *parent_class = NULL;
-
-
 GType
 balsa_mime_widget_get_type()
 {
@@ -65,7 +60,7 @@ balsa_mime_widget_get_type()
             sizeof(BalsaMimeWidgetClass),
             NULL,               /* base_init */
             NULL,               /* base_finalize */
-            (GClassInitFunc) balsa_mime_widget_class_init,
+            NULL,               /* class_init */
             NULL,               /* class_finalize */
             NULL,               /* class_data */
             sizeof(BalsaMimeWidget),
@@ -92,16 +87,6 @@ balsa_mime_widget_init (GTypeInstance *instance, gpointer g_class)
 }
 
 
-static void
-balsa_mime_widget_class_init(BalsaMimeWidgetClass * klass)
-{
-    GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
-    parent_class = g_type_class_ref(G_TYPE_OBJECT);
-    object_class->finalize = balsa_mime_widget_finalize;
-}
-
-
 /* wildcard defined whether the mime_type matches all subtypes */
 typedef struct _mime_delegate_t {
     gboolean wildcard;
@@ -201,20 +186,6 @@ balsa_mime_widget_new(BalsaMessage * bm, LibBalsaMessageBody * mime_body, gpoint
 }
 
 
-static void
-balsa_mime_widget_finalize(GObject * object)
-{
-    BalsaMimeWidget * mime_widget = BALSA_MIME_WIDGET(object);
-
-    if (mime_widget->container && mime_widget->container != mime_widget->widget)
-       gtk_widget_destroy(mime_widget->container);
-    mime_widget->container = NULL;
-    g_clear_object(&mime_widget->widget);
-
-    G_OBJECT_CLASS(parent_class)->finalize(object);
-}
-
-
 static BalsaMimeWidget *
 balsa_mime_widget_new_unknown(BalsaMessage * bm,
                              LibBalsaMessageBody * mime_body,
diff --git a/src/balsa-print-object-decor.c b/src/balsa-print-object-decor.c
index 81003c4..741ec8d 100644
--- a/src/balsa-print-object-decor.c
+++ b/src/balsa-print-object-decor.c
@@ -29,7 +29,7 @@
 static void
 balsa_print_object_decor_class_init(BalsaPrintObjectDecorClass *klass);
 static void balsa_print_object_decor_init (GTypeInstance *instance, gpointer g_class);
-static void balsa_print_object_decor_destroy(GObject * self);
+static void balsa_print_object_decor_finalize(GObject * self);
 
 static void balsa_print_object_decor_draw(BalsaPrintObject * self,
                                          GtkPrintContext * context,
@@ -73,7 +73,7 @@ balsa_print_object_decor_class_init(BalsaPrintObjectDecorClass *klass)
     parent_class = g_type_class_ref(BALSA_TYPE_PRINT_OBJECT);
     BALSA_PRINT_OBJECT_CLASS(klass)->draw =
        balsa_print_object_decor_draw;
-    G_OBJECT_CLASS(klass)->finalize = balsa_print_object_decor_destroy;
+    G_OBJECT_CLASS(klass)->finalize = balsa_print_object_decor_finalize;
 }
 
 
@@ -88,7 +88,7 @@ balsa_print_object_decor_init(GTypeInstance * instance,
 
 
 static void
-balsa_print_object_decor_destroy(GObject * self)
+balsa_print_object_decor_finalize(GObject * self)
 {
     BalsaPrintObjectDecor *po = BALSA_PRINT_OBJECT_DECOR(self);
 
diff --git a/src/balsa-print-object-default.c b/src/balsa-print-object-default.c
index d3d9f50..db9e14f 100644
--- a/src/balsa-print-object-default.c
+++ b/src/balsa-print-object-default.c
@@ -34,7 +34,8 @@ balsa_print_object_default_class_init(BalsaPrintObjectDefaultClass *
                                      klass);
 static void balsa_print_object_default_init(GTypeInstance * instance,
                                            gpointer g_class);
-static void balsa_print_object_default_destroy(GObject * self);
+static void balsa_print_object_default_dispose(GObject * self);
+static void balsa_print_object_default_finalize(GObject * self);
 
 static void balsa_print_object_default_draw(BalsaPrintObject * self,
                                            GtkPrintContext * context,
@@ -78,7 +79,8 @@ balsa_print_object_default_class_init(BalsaPrintObjectDefaultClass * klass)
     parent_class = g_type_class_ref(BALSA_TYPE_PRINT_OBJECT);
     BALSA_PRINT_OBJECT_CLASS(klass)->draw =
        balsa_print_object_default_draw;
-    G_OBJECT_CLASS(klass)->finalize = balsa_print_object_default_destroy;
+    G_OBJECT_CLASS(klass)->dispose = balsa_print_object_default_dispose;
+    G_OBJECT_CLASS(klass)->finalize = balsa_print_object_default_finalize;
 }
 
 
@@ -93,11 +95,21 @@ balsa_print_object_default_init(GTypeInstance * instance, gpointer g_class)
 
 
 static void
-balsa_print_object_default_destroy(GObject * self)
+balsa_print_object_default_dispose(GObject * self)
 {
     BalsaPrintObjectDefault *po = BALSA_PRINT_OBJECT_DEFAULT(self);
 
     g_clear_object(&po->pixbuf);
+
+    G_OBJECT_CLASS(parent_class)->dispose(self);
+}
+
+
+static void
+balsa_print_object_default_finalize(GObject * self)
+{
+    BalsaPrintObjectDefault *po = BALSA_PRINT_OBJECT_DEFAULT(self);
+
     g_free(po->description);
 
     G_OBJECT_CLASS(parent_class)->finalize(self);
diff --git a/src/balsa-print-object-header.c b/src/balsa-print-object-header.c
index 8003e9e..24d244c 100644
--- a/src/balsa-print-object-header.c
+++ b/src/balsa-print-object-header.c
@@ -33,7 +33,7 @@
 static void balsa_print_object_header_class_init(BalsaPrintObjectHeaderClass * klass);
 static void balsa_print_object_header_init(GTypeInstance * instance,
                                            gpointer g_class);
-static void balsa_print_object_header_destroy(GObject * self);
+static void balsa_print_object_header_finalize(GObject * self);
 
 static void balsa_print_object_header_draw(BalsaPrintObject * self,
                                            GtkPrintContext * context,
@@ -87,7 +87,7 @@ balsa_print_object_header_class_init(BalsaPrintObjectHeaderClass * klass)
     parent_class = g_type_class_ref(BALSA_TYPE_PRINT_OBJECT);
     BALSA_PRINT_OBJECT_CLASS(klass)->draw =
        balsa_print_object_header_draw;
-    G_OBJECT_CLASS(klass)->finalize = balsa_print_object_header_destroy;
+    G_OBJECT_CLASS(klass)->finalize = balsa_print_object_header_finalize;
 }
 
 
@@ -101,7 +101,7 @@ balsa_print_object_header_init(GTypeInstance * instance, gpointer g_class)
 
 
 static void
-balsa_print_object_header_destroy(GObject * self)
+balsa_print_object_header_finalize(GObject * self)
 {
     BalsaPrintObjectHeader *po = BALSA_PRINT_OBJECT_HEADER(self);
 
diff --git a/src/balsa-print-object-image.c b/src/balsa-print-object-image.c
index b4f75b8..ad7ccfb 100644
--- a/src/balsa-print-object-image.c
+++ b/src/balsa-print-object-image.c
@@ -30,7 +30,7 @@ static void
 balsa_print_object_image_class_init(BalsaPrintObjectImageClass * klass);
 static void balsa_print_object_image_init (GTypeInstance *instance,
                                           gpointer g_class);
-static void balsa_print_object_image_destroy(GObject * self);
+static void balsa_print_object_image_dispose(GObject * self);
 
 static void balsa_print_object_image_draw(BalsaPrintObject * self,
                                          GtkPrintContext * context,
@@ -74,7 +74,7 @@ balsa_print_object_image_class_init(BalsaPrintObjectImageClass * klass)
     parent_class = g_type_class_ref(BALSA_TYPE_PRINT_OBJECT);
     BALSA_PRINT_OBJECT_CLASS(klass)->draw =
        balsa_print_object_image_draw;
-    G_OBJECT_CLASS(klass)->finalize = balsa_print_object_image_destroy;
+    G_OBJECT_CLASS(klass)->dispose = balsa_print_object_image_dispose;
 }
 
 
@@ -89,13 +89,13 @@ balsa_print_object_image_init(GTypeInstance * instance, gpointer g_class)
 
 
 static void
-balsa_print_object_image_destroy(GObject * self)
+balsa_print_object_image_dispose(GObject * self)
 {
     BalsaPrintObjectImage *po = BALSA_PRINT_OBJECT_IMAGE(self);
 
     g_clear_object(&po->pixbuf);
 
-    G_OBJECT_CLASS(parent_class)->finalize(self);
+    G_OBJECT_CLASS(parent_class)->dispose(self);
 }
 
 
diff --git a/src/balsa-print-object-text.c b/src/balsa-print-object-text.c
index 6d310c1..df96ffb 100644
--- a/src/balsa-print-object-text.c
+++ b/src/balsa-print-object-text.c
@@ -51,7 +51,7 @@ typedef struct {
 static void balsa_print_object_text_class_init(BalsaPrintObjectTextClass * klass);
 static void balsa_print_object_text_init(GTypeInstance * instance,
                                         gpointer g_class);
-static void balsa_print_object_text_destroy(GObject * self);
+static void balsa_print_object_text_finalize(GObject * self);
 
 static void balsa_print_object_text_draw(BalsaPrintObject * self,
                                         GtkPrintContext * context,
@@ -100,7 +100,7 @@ balsa_print_object_text_class_init(BalsaPrintObjectTextClass * klass)
     parent_class = g_type_class_ref(BALSA_TYPE_PRINT_OBJECT);
     BALSA_PRINT_OBJECT_CLASS(klass)->draw =
        balsa_print_object_text_draw;
-    G_OBJECT_CLASS(klass)->finalize = balsa_print_object_text_destroy;
+    G_OBJECT_CLASS(klass)->finalize = balsa_print_object_text_finalize;
 }
 
 
@@ -115,12 +115,11 @@ balsa_print_object_text_init(GTypeInstance * instance, gpointer g_class)
 
 
 static void
-balsa_print_object_text_destroy(GObject * self)
+balsa_print_object_text_finalize(GObject * self)
 {
     BalsaPrintObjectText *po = BALSA_PRINT_OBJECT_TEXT(self);
 
-    g_list_foreach(po->attributes, (GFunc) g_free, NULL);
-    g_list_free(po->attributes);
+    g_list_free_full(po->attributes, g_free);
     g_free(po->text);
 
     G_OBJECT_CLASS(parent_class)->finalize(self);
diff --git a/src/balsa-print-object.c b/src/balsa-print-object.c
index 4f557be..4c2a535 100644
--- a/src/balsa-print-object.c
+++ b/src/balsa-print-object.c
@@ -38,7 +38,6 @@
 static void balsa_print_object_init(GTypeInstance * instance,
                                    gpointer g_class);
 static void balsa_print_object_class_init(BalsaPrintObjectClass * klass);
-static void balsa_print_object_destroy(GObject * object);
 
 
 static GObjectClass *parent_class = NULL;
@@ -88,10 +87,7 @@ balsa_print_object_init(GTypeInstance * instance, gpointer g_class)
 static void
 balsa_print_object_class_init(BalsaPrintObjectClass * klass)
 {
-    GObjectClass *object_class = G_OBJECT_CLASS(klass);
-
     parent_class = g_type_class_ref(G_TYPE_OBJECT);
-    object_class->finalize = balsa_print_object_destroy;
     klass->draw = balsa_print_object_draw;
 }
 
@@ -206,13 +202,6 @@ balsa_print_object_draw(BalsaPrintObject * self, GtkPrintContext * context,
 }
 
 
-static void
-balsa_print_object_destroy(GObject * object)
-{
-    parent_class->finalize(object);
-}
-
-
 /*  == various print helper functions ==  */
 
 /* return the width of the passed string in Pango units */
diff --git a/src/filter-run-dialog.c b/src/filter-run-dialog.c
index 47013b5..7e31bcd 100644
--- a/src/filter-run-dialog.c
+++ b/src/filter-run-dialog.c
@@ -450,15 +450,17 @@ void balsa_filter_run_dialog_init(BalsaFilterRunDialog * p)
 }
 
 /* balsa_filter_run_dispose:
-   FIXME: why is it called twice? Is it a problem?
 */
 static void
 balsa_filter_run_dispose(GObject * object)
 {
     BalsaFilterRunDialog* bfrd = BALSA_FILTER_RUN_DIALOG(object);
-    if (bfrd->mbox)
+
+    if (bfrd->mbox != NULL) {
         libbalsa_mailbox_close(bfrd->mbox, balsa_app.expunge_on_close);
-    bfrd->mbox = NULL;
+        bfrd->mbox = NULL;
+    }
+
     G_OBJECT_CLASS(parent_class)->dispose(object);
 }
 
diff --git a/src/mailbox-node.c b/src/mailbox-node.c
index e5af7b4..67c5c7b 100644
--- a/src/mailbox-node.c
+++ b/src/mailbox-node.c
@@ -192,14 +192,14 @@ balsa_mailbox_node_dispose(GObject * object)
     BalsaMailboxNode *mn = BALSA_MAILBOX_NODE(object);
     LibBalsaMailbox *mailbox = mn->mailbox;
 
-    if (mailbox) {
+    if (mailbox != NULL) {
         libbalsa_mailbox_set_open(mailbox,
                                   libbalsa_mailbox_is_open(mailbox));
         config_save_mailbox_view(mailbox->url, mailbox->view);
-       if (balsa_app.main_window)
+       if (balsa_app.main_window != NULL) {
            balsa_window_close_mbnode(balsa_app.main_window, mn);
-       g_object_unref(mailbox);
-       mn->mailbox = NULL;
+        }
+        g_clear_object(&mn->mailbox);
     }
 
     G_OBJECT_CLASS(parent_class)->dispose(object);
@@ -213,19 +213,18 @@ balsa_mailbox_node_finalize(GObject * object)
     mn = BALSA_MAILBOX_NODE(object);
 
     balsa_mailbox_node_clear_children_cache(mn);
-    mn->parent  = NULL; 
-    g_free(mn->name);          mn->name = NULL;
-    g_free(mn->dir);           mn->dir = NULL;
-    g_free(mn->config_prefix); mn->config_prefix = NULL;
+    mn->parent  = NULL;
+    g_free(mn->name);
+    g_free(mn->dir);
+    g_free(mn->config_prefix);
 
-    if (mn->server) {
+    if (mn->server != NULL) {
        g_signal_handlers_disconnect_matched(mn->server,
                                              G_SIGNAL_MATCH_DATA, 0,
                                             (GQuark) 0, NULL, NULL, mn);
-       mn->server = NULL;
     }
 
-    G_OBJECT_CLASS(parent_class)->finalize(G_OBJECT(object));
+    G_OBJECT_CLASS(parent_class)->finalize(object);
 }
 
 static void
diff --git a/src/main-window.c b/src/main-window.c
index 9433bdc..9f8995c 100644
--- a/src/main-window.c
+++ b/src/main-window.c
@@ -108,7 +108,7 @@ static void balsa_window_real_open_mbnode(BalsaWindow *window,
                                           gboolean set_current);
 static void balsa_window_real_close_mbnode(BalsaWindow *window,
                                           BalsaMailboxNode *mbnode);
-static void balsa_window_destroy(GObject * object);
+static void balsa_window_dispose(GObject * object);
 
 static gboolean bw_close_mailbox_on_timer(BalsaWindow * window);
 
@@ -206,7 +206,7 @@ balsa_window_class_init(BalsaWindowClass * klass)
                      NULL, NULL,
                      g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
 
-    object_class->dispose = balsa_window_destroy;
+    object_class->dispose = balsa_window_dispose;
 
     klass->open_mbnode  = balsa_window_real_open_mbnode;
     klass->close_mbnode = balsa_window_real_close_mbnode;
@@ -3110,7 +3110,7 @@ bw_close_mailbox_on_timer(BalsaWindow * window)
 }
 
 static void
-balsa_window_destroy(GObject * object)
+balsa_window_dispose(GObject * object)
 {
     BalsaWindow *window;
 
@@ -3120,15 +3120,11 @@ balsa_window_destroy(GObject * object)
      * we no longer need it, so we just drop our pointer: */
     window->preview = NULL;
 
-    if (window->network_changed_source_id != 0) {
-        g_source_remove(window->network_changed_source_id);
-        window->network_changed_source_id = 0;
-    }
-
-    if (G_OBJECT_CLASS(balsa_window_parent_class)->dispose != NULL)
-        G_OBJECT_CLASS(balsa_window_parent_class)->dispose(object);
+    libbalsa_clear_source_id(&window->network_changed_source_id);
 
     balsa_unregister_pixmaps();
+
+    G_OBJECT_CLASS(balsa_window_parent_class)->dispose(object);
 }
 
 
diff --git a/src/sendmsg-window.c b/src/sendmsg-window.c
index 16ab6fe..4688a52 100644
--- a/src/sendmsg-window.c
+++ b/src/sendmsg-window.c
@@ -289,7 +289,7 @@ struct _BalsaAttachInfoClass {
 static GType balsa_attach_info_get_type();
 static void balsa_attach_info_init(GObject *object, gpointer data);
 static BalsaAttachInfo* balsa_attach_info_new();
-static void balsa_attach_info_destroy(GObject * object);
+static void balsa_attach_info_finalize(GObject * object);
 
 
 #define BALSA_MSG_ATTACH_MODEL(x)   gtk_tree_view_get_model(GTK_TREE_VIEW((x)->tree_view))
@@ -307,7 +307,7 @@ balsa_attach_info_class_init(BalsaAttachInfoClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS(klass);
 
-    object_class->finalize = balsa_attach_info_destroy;
+    object_class->finalize = balsa_attach_info_finalize;
 }
 
 static GType
@@ -359,7 +359,7 @@ balsa_attach_info_new(BalsaSendmsg *bm)
 }
 
 static void
-balsa_attach_info_destroy(GObject * object)
+balsa_attach_info_finalize(GObject * object)
 {
     BalsaAttachInfo * info;
     GObjectClass *parent_class;
diff --git a/src/toolbar-factory.c b/src/toolbar-factory.c
index 4c815b9..1dd1b39 100644
--- a/src/toolbar-factory.c
+++ b/src/toolbar-factory.c
@@ -62,15 +62,24 @@ static GObjectClass* parent_class;
 static guint model_signals[LAST_SIGNAL] = { 0 };
 
 static void
+balsa_toolbar_model_dispose(GObject * object)
+{
+    BalsaToolbarModel *model = BALSA_TOOLBAR_MODEL(object);
+
+    g_clear_object(&model->settings);
+
+    G_OBJECT_CLASS(parent_class)->dispose(object);
+}
+
+
+static void
 balsa_toolbar_model_finalize(GObject * object)
 {
     BalsaToolbarModel *model = BALSA_TOOLBAR_MODEL(object);
 
     if (model->legal) {
         g_hash_table_destroy(model->legal);
-        model->legal = NULL;
     }
-    g_clear_object(&model->settings);
 
     G_OBJECT_CLASS(parent_class)->finalize(object);
 }
@@ -90,6 +99,7 @@ balsa_toolbar_model_class_init(BalsaToolbarModelClass* klass)
                      g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
 
     object_class = G_OBJECT_CLASS(klass);
+    object_class->dispose = balsa_toolbar_model_dispose;
     object_class->finalize = balsa_toolbar_model_finalize;
 }
 


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