diff --git a/src/mu-msg.c b/src/mu-msg.c index fa4626c7..283f651e 100644 --- a/src/mu-msg.c +++ b/src/mu-msg.c @@ -186,6 +186,7 @@ MuMsg* mu_msg_ref (MuMsg *msg) { g_return_val_if_fail (msg, NULL); + ++msg->_refcount; return msg; @@ -210,20 +211,20 @@ mu_msg_new (const char* filepath, const gchar* mdir, GError **err) g_return_val_if_fail (filepath, NULL); g_return_val_if_fail (_gmime_initialized, NULL); - msg = g_slice_new0 (MuMsg); - msg->_prio = MU_MSG_PRIO_NONE; - + msg = g_slice_new0 (MuMsg); + msg->_prio = MU_MSG_PRIO_NONE; + msg->_refcount = 1; + if (!init_file_metadata(msg, filepath, mdir, err)) { - mu_msg_destroy (msg); + mu_msg_unref (msg); return NULL; } if (!init_mime_msg(msg, err)) { - mu_msg_destroy (msg); + mu_msg_unref (msg); return NULL; } - - msg->_refcount = 1; + return msg; } diff --git a/widgets/mu-msg-attach-view.c b/widgets/mu-msg-attach-view.c index 9cfa11c4..c9d4c6ec 100644 --- a/widgets/mu-msg-attach-view.c +++ b/widgets/mu-msg-attach-view.c @@ -55,6 +55,23 @@ static guint signals[LAST_SIGNAL] = {0}; G_DEFINE_TYPE (MuMsgAttachView, mu_msg_attach_view, GTK_TYPE_ICON_VIEW); + +static void +set_message (MuMsgAttachView *self, MuMsg *msg) +{ + if (self->_priv->_msg == msg) + return; /* nothing to todo */ + + if (self->_priv->_msg) { + mu_msg_unref (self->_priv->_msg); + self->_priv->_msg = NULL; + } + + if (msg) + self->_priv->_msg = mu_msg_ref (msg); +} + + static void mu_msg_attach_view_class_init (MuMsgAttachViewClass *klass) { @@ -193,12 +210,8 @@ mu_msg_attach_view_init (MuMsgAttachView *obj) static void mu_msg_attach_view_finalize (GObject *obj) { - MuMsg *msg; + set_message (MU_MSG_ATTACH_VIEW(obj), NULL); - msg = MU_MSG_ATTACH_VIEW(obj)->_priv->_msg; - if (msg) - mu_msg_unref (msg); - G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -264,13 +277,11 @@ mu_msg_attach_view_set_message (MuMsgAttachView *self, MuMsg *msg) store = GTK_LIST_STORE (gtk_icon_view_get_model (GTK_ICON_VIEW(self))); gtk_list_store_clear (store); - if (self->_priv->_msg) - mu_msg_unref (self->_priv->_msg); + set_message (self, msg); if (!msg) return 0; - - self->_priv->_msg = mu_msg_ref (msg); + cbdata.store = store; cbdata.count = 0; diff --git a/widgets/mu-msg-body-view.c b/widgets/mu-msg-body-view.c index 4f3ba723..f3053e78 100644 --- a/widgets/mu-msg-body-view.c +++ b/widgets/mu-msg-body-view.c @@ -60,6 +60,21 @@ static guint signals[LAST_SIGNAL] = {0}; G_DEFINE_TYPE (MuMsgBodyView, mu_msg_body_view, WEBKIT_TYPE_WEB_VIEW); +static void +set_message (MuMsgBodyView *self, MuMsg *msg) +{ + if (self->_priv->_msg == msg) + return; /* nothing to todo */ + + if (self->_priv->_msg) { + mu_msg_unref (self->_priv->_msg); + self->_priv->_msg = NULL; + } + + if (msg) + self->_priv->_msg = mu_msg_ref (msg); +} + static void mu_msg_body_view_class_init (MuMsgBodyViewClass *klass) { @@ -287,8 +302,7 @@ mu_msg_body_view_finalize (GObject *obj) if (priv && priv->_settings) g_object_unref (priv->_settings); - if (priv->_msg) - mu_msg_unref (priv->_msg); + set_message (MU_MSG_BODY_VIEW(obj), NULL); G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -331,16 +345,7 @@ mu_msg_body_view_set_message (MuMsgBodyView *self, MuMsg *msg) g_return_if_fail (self); - /* ref this one before unreffing priv->_msg, it may be the - * same...*/ - if (msg) - msg = mu_msg_ref (msg); - - if (self->_priv->_msg) { - mu_msg_unref (self->_priv->_msg); - self->_priv->_msg = NULL; - } - self->_priv->_msg = msg; + set_message (self, msg); data = msg ? mu_msg_get_body_html (msg) : ""; if (data) @@ -360,6 +365,8 @@ mu_msg_body_view_set_message_source (MuMsgBodyView *self, MuMsg *msg) g_return_if_fail (MU_IS_MSG_BODY_VIEW(self)); g_return_if_fail (msg); + + set_message (self, NULL); path = msg ? mu_msg_get_path (msg) : NULL; @@ -380,10 +387,8 @@ mu_msg_body_view_set_note (MuMsgBodyView *self, const gchar *html) g_return_if_fail (self); g_return_if_fail (html); - if (self->_priv->_msg) { - mu_msg_unref (self->_priv->_msg); - self->_priv->_msg = NULL; - } + set_message (self, NULL); + set_html (self, html); self->_priv->_view_mode = VIEW_MODE_NOTE; diff --git a/widgets/mu-msg-header-view.c b/widgets/mu-msg-header-view.c index a8b15a44..540b7a05 100644 --- a/widgets/mu-msg-header-view.c +++ b/widgets/mu-msg-header-view.c @@ -46,6 +46,7 @@ static GtkVBoxClass *parent_class = NULL; G_DEFINE_TYPE (MuMsgHeaderView, mu_msg_header_view, GTK_TYPE_VBOX); + static void mu_msg_header_view_class_init (MuMsgHeaderViewClass *klass) { @@ -75,7 +76,6 @@ mu_msg_header_view_init (MuMsgHeaderView *obj) static void mu_msg_header_view_finalize (GObject *obj) { -/* free/unref instance resources here */ G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -168,7 +168,7 @@ void mu_msg_header_view_set_message (MuMsgHeaderView *self, MuMsg *msg) { g_return_if_fail (MU_IS_MSG_HEADER_VIEW(self)); - + if (self->_priv->_table) { gtk_container_remove (GTK_CONTAINER(self), self->_priv->_table); self->_priv->_table = NULL; diff --git a/widgets/mu-msg-view.c b/widgets/mu-msg-view.c index af6def70..0f4ef7ce 100644 --- a/widgets/mu-msg-view.c +++ b/widgets/mu-msg-view.c @@ -50,6 +50,22 @@ static GtkVBoxClass *parent_class = NULL; G_DEFINE_TYPE (MuMsgView, mu_msg_view, GTK_TYPE_VBOX); +static void +set_message (MuMsgView *self, MuMsg *msg) +{ + if (self->_priv->_msg == msg) + return; /* nothing to todo */ + + if (self->_priv->_msg) { + mu_msg_unref (self->_priv->_msg); + self->_priv->_msg = NULL; + } + + if (msg) + self->_priv->_msg = mu_msg_ref (msg); +} + + static void mu_msg_view_class_init (MuMsgViewClass *klass) { @@ -107,7 +123,8 @@ static void mu_msg_view_init (MuMsgView *self) { self->_priv = MU_MSG_VIEW_GET_PRIVATE(self); - + + self->_priv->_msg = NULL; self->_priv->_headers = mu_msg_header_view_new (); self->_priv->_attach = mu_msg_attach_view_new (); @@ -136,7 +153,8 @@ mu_msg_view_init (MuMsgView *self) static void mu_msg_view_finalize (GObject *obj) { -/* free/unref instance resources here */ + set_message (MU_MSG_VIEW (obj), NULL); + G_OBJECT_CLASS(parent_class)->finalize (obj); } @@ -146,46 +164,14 @@ mu_msg_view_new (void) return GTK_WIDGET(g_object_new(MU_TYPE_MSG_VIEW, NULL)); } - -struct _ChildData { - GtkWidget *child; - gboolean show; -}; -typedef struct _ChildData ChildData; - -static void -each_child_visibility (GtkWidget *child, ChildData *cdata) -{ - if (child == cdata->child) - gtk_widget_set_visible (child, cdata->show); -} - -static void -set_visibility (MuMsgView *self, GtkWidget *w, gboolean show) -{ - ChildData cdata; - - cdata.child = w; - cdata.show = show; - - gtk_container_foreach (GTK_CONTAINER(self), - (GtkCallback)each_child_visibility, - &cdata); -} - - - void mu_msg_view_set_message (MuMsgView *self, MuMsg *msg) { gint attachnum; g_return_if_fail (MU_IS_MSG_VIEW(self)); - - if (self->_priv->_msg) - mu_msg_unref (self->_priv->_msg); - self->_priv->_msg = msg ? mu_msg_ref (msg) : NULL; + set_message (self, msg); mu_msg_header_view_set_message (MU_MSG_HEADER_VIEW(self->_priv->_headers), msg); @@ -195,9 +181,9 @@ mu_msg_view_set_message (MuMsgView *self, MuMsg *msg) mu_msg_body_view_set_message (MU_MSG_BODY_VIEW(self->_priv->_body), msg); - set_visibility (self, self->_priv->_headers, TRUE); - set_visibility (self, self->_priv->_attachexpander, attachnum > 0); - set_visibility (self, self->_priv->_body, TRUE); + gtk_widget_set_visible (self->_priv->_headers, TRUE); + gtk_widget_set_visible (self->_priv->_attachexpander, attachnum > 0); + gtk_widget_set_visible (self->_priv->_body, TRUE); } @@ -206,18 +192,15 @@ void mu_msg_view_set_message_source (MuMsgView *self, MuMsg *msg) { g_return_if_fail (MU_IS_MSG_VIEW(self)); + + set_message (self, msg); - if (self->_priv->_msg) - mu_msg_unref (self->_priv->_msg); - - self->_priv->_msg = msg ? mu_msg_ref (msg) : NULL; - mu_msg_body_view_set_message_source (MU_MSG_BODY_VIEW(self->_priv->_body), msg); - set_visibility (self, self->_priv->_headers, FALSE); - set_visibility (self, self->_priv->_attachexpander, FALSE); - set_visibility (self, self->_priv->_body, TRUE); + gtk_widget_set_visible (self->_priv->_headers, FALSE); + gtk_widget_set_visible (self->_priv->_attachexpander, FALSE); + gtk_widget_set_visible (self->_priv->_body, TRUE); } @@ -227,9 +210,9 @@ mu_msg_view_set_note (MuMsgView *self, const gchar* html) { g_return_if_fail (MU_IS_MSG_VIEW(self)); - set_visibility (self, self->_priv->_headers, FALSE); - set_visibility (self, self->_priv->_attachexpander, FALSE); - set_visibility (self, self->_priv->_body, TRUE); + gtk_widget_set_visible (self->_priv->_headers, FALSE); + gtk_widget_set_visible (self->_priv->_attachexpander, FALSE); + gtk_widget_set_visible (self->_priv->_body, TRUE); mu_msg_body_view_set_note (MU_MSG_BODY_VIEW(self->_priv->_body), html);