* fix mu_msg refcounting in widgets
This commit is contained in:
11
src/mu-msg.c
11
src/mu-msg.c
@ -186,6 +186,7 @@ MuMsg*
|
|||||||
mu_msg_ref (MuMsg *msg)
|
mu_msg_ref (MuMsg *msg)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (msg, NULL);
|
g_return_val_if_fail (msg, NULL);
|
||||||
|
|
||||||
++msg->_refcount;
|
++msg->_refcount;
|
||||||
|
|
||||||
return msg;
|
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 (filepath, NULL);
|
||||||
g_return_val_if_fail (_gmime_initialized, NULL);
|
g_return_val_if_fail (_gmime_initialized, NULL);
|
||||||
|
|
||||||
msg = g_slice_new0 (MuMsg);
|
msg = g_slice_new0 (MuMsg);
|
||||||
msg->_prio = MU_MSG_PRIO_NONE;
|
msg->_prio = MU_MSG_PRIO_NONE;
|
||||||
|
msg->_refcount = 1;
|
||||||
|
|
||||||
if (!init_file_metadata(msg, filepath, mdir, err)) {
|
if (!init_file_metadata(msg, filepath, mdir, err)) {
|
||||||
mu_msg_destroy (msg);
|
mu_msg_unref (msg);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!init_mime_msg(msg, err)) {
|
if (!init_mime_msg(msg, err)) {
|
||||||
mu_msg_destroy (msg);
|
mu_msg_unref (msg);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
msg->_refcount = 1;
|
|
||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -55,6 +55,23 @@ static guint signals[LAST_SIGNAL] = {0};
|
|||||||
|
|
||||||
G_DEFINE_TYPE (MuMsgAttachView, mu_msg_attach_view, GTK_TYPE_ICON_VIEW);
|
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
|
static void
|
||||||
mu_msg_attach_view_class_init (MuMsgAttachViewClass *klass)
|
mu_msg_attach_view_class_init (MuMsgAttachViewClass *klass)
|
||||||
{
|
{
|
||||||
@ -193,11 +210,7 @@ mu_msg_attach_view_init (MuMsgAttachView *obj)
|
|||||||
static void
|
static void
|
||||||
mu_msg_attach_view_finalize (GObject *obj)
|
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);
|
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)));
|
store = GTK_LIST_STORE (gtk_icon_view_get_model (GTK_ICON_VIEW(self)));
|
||||||
gtk_list_store_clear (store);
|
gtk_list_store_clear (store);
|
||||||
|
|
||||||
if (self->_priv->_msg)
|
set_message (self, msg);
|
||||||
mu_msg_unref (self->_priv->_msg);
|
|
||||||
|
|
||||||
if (!msg)
|
if (!msg)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
self->_priv->_msg = mu_msg_ref (msg);
|
|
||||||
|
|
||||||
cbdata.store = store;
|
cbdata.store = store;
|
||||||
cbdata.count = 0;
|
cbdata.count = 0;
|
||||||
|
|||||||
@ -60,6 +60,21 @@ static guint signals[LAST_SIGNAL] = {0};
|
|||||||
|
|
||||||
G_DEFINE_TYPE (MuMsgBodyView, mu_msg_body_view, WEBKIT_TYPE_WEB_VIEW);
|
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
|
static void
|
||||||
mu_msg_body_view_class_init (MuMsgBodyViewClass *klass)
|
mu_msg_body_view_class_init (MuMsgBodyViewClass *klass)
|
||||||
{
|
{
|
||||||
@ -287,8 +302,7 @@ mu_msg_body_view_finalize (GObject *obj)
|
|||||||
if (priv && priv->_settings)
|
if (priv && priv->_settings)
|
||||||
g_object_unref (priv->_settings);
|
g_object_unref (priv->_settings);
|
||||||
|
|
||||||
if (priv->_msg)
|
set_message (MU_MSG_BODY_VIEW(obj), NULL);
|
||||||
mu_msg_unref (priv->_msg);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS(parent_class)->finalize (obj);
|
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);
|
g_return_if_fail (self);
|
||||||
|
|
||||||
/* ref this one before unreffing priv->_msg, it may be the
|
set_message (self, msg);
|
||||||
* 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;
|
|
||||||
|
|
||||||
data = msg ? mu_msg_get_body_html (msg) : "";
|
data = msg ? mu_msg_get_body_html (msg) : "";
|
||||||
if (data)
|
if (data)
|
||||||
@ -361,6 +366,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 (MU_IS_MSG_BODY_VIEW(self));
|
||||||
g_return_if_fail (msg);
|
g_return_if_fail (msg);
|
||||||
|
|
||||||
|
set_message (self, NULL);
|
||||||
|
|
||||||
path = msg ? mu_msg_get_path (msg) : NULL;
|
path = msg ? mu_msg_get_path (msg) : NULL;
|
||||||
|
|
||||||
if (path && g_file_get_contents (path, &data, NULL, NULL)) {
|
if (path && g_file_get_contents (path, &data, NULL, 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 (self);
|
||||||
g_return_if_fail (html);
|
g_return_if_fail (html);
|
||||||
|
|
||||||
if (self->_priv->_msg) {
|
set_message (self, NULL);
|
||||||
mu_msg_unref (self->_priv->_msg);
|
|
||||||
self->_priv->_msg = NULL;
|
|
||||||
}
|
|
||||||
set_html (self, html);
|
set_html (self, html);
|
||||||
|
|
||||||
self->_priv->_view_mode = VIEW_MODE_NOTE;
|
self->_priv->_view_mode = VIEW_MODE_NOTE;
|
||||||
|
|||||||
@ -46,6 +46,7 @@ static GtkVBoxClass *parent_class = NULL;
|
|||||||
|
|
||||||
G_DEFINE_TYPE (MuMsgHeaderView, mu_msg_header_view, GTK_TYPE_VBOX);
|
G_DEFINE_TYPE (MuMsgHeaderView, mu_msg_header_view, GTK_TYPE_VBOX);
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mu_msg_header_view_class_init (MuMsgHeaderViewClass *klass)
|
mu_msg_header_view_class_init (MuMsgHeaderViewClass *klass)
|
||||||
{
|
{
|
||||||
@ -75,7 +76,6 @@ mu_msg_header_view_init (MuMsgHeaderView *obj)
|
|||||||
static void
|
static void
|
||||||
mu_msg_header_view_finalize (GObject *obj)
|
mu_msg_header_view_finalize (GObject *obj)
|
||||||
{
|
{
|
||||||
/* free/unref instance resources here */
|
|
||||||
G_OBJECT_CLASS(parent_class)->finalize (obj);
|
G_OBJECT_CLASS(parent_class)->finalize (obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -50,6 +50,22 @@ static GtkVBoxClass *parent_class = NULL;
|
|||||||
|
|
||||||
G_DEFINE_TYPE (MuMsgView, mu_msg_view, GTK_TYPE_VBOX);
|
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
|
static void
|
||||||
mu_msg_view_class_init (MuMsgViewClass *klass)
|
mu_msg_view_class_init (MuMsgViewClass *klass)
|
||||||
{
|
{
|
||||||
@ -108,6 +124,7 @@ mu_msg_view_init (MuMsgView *self)
|
|||||||
{
|
{
|
||||||
self->_priv = MU_MSG_VIEW_GET_PRIVATE(self);
|
self->_priv = MU_MSG_VIEW_GET_PRIVATE(self);
|
||||||
|
|
||||||
|
self->_priv->_msg = NULL;
|
||||||
self->_priv->_headers = mu_msg_header_view_new ();
|
self->_priv->_headers = mu_msg_header_view_new ();
|
||||||
|
|
||||||
self->_priv->_attach = mu_msg_attach_view_new ();
|
self->_priv->_attach = mu_msg_attach_view_new ();
|
||||||
@ -136,7 +153,8 @@ mu_msg_view_init (MuMsgView *self)
|
|||||||
static void
|
static void
|
||||||
mu_msg_view_finalize (GObject *obj)
|
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);
|
G_OBJECT_CLASS(parent_class)->finalize (obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -146,35 +164,6 @@ mu_msg_view_new (void)
|
|||||||
return GTK_WIDGET(g_object_new(MU_TYPE_MSG_VIEW, NULL));
|
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
|
void
|
||||||
mu_msg_view_set_message (MuMsgView *self, MuMsg *msg)
|
mu_msg_view_set_message (MuMsgView *self, MuMsg *msg)
|
||||||
{
|
{
|
||||||
@ -182,10 +171,7 @@ mu_msg_view_set_message (MuMsgView *self, MuMsg *msg)
|
|||||||
|
|
||||||
g_return_if_fail (MU_IS_MSG_VIEW(self));
|
g_return_if_fail (MU_IS_MSG_VIEW(self));
|
||||||
|
|
||||||
if (self->_priv->_msg)
|
set_message (self, msg);
|
||||||
mu_msg_unref (self->_priv->_msg);
|
|
||||||
|
|
||||||
self->_priv->_msg = msg ? mu_msg_ref (msg) : NULL;
|
|
||||||
|
|
||||||
mu_msg_header_view_set_message (MU_MSG_HEADER_VIEW(self->_priv->_headers),
|
mu_msg_header_view_set_message (MU_MSG_HEADER_VIEW(self->_priv->_headers),
|
||||||
msg);
|
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),
|
mu_msg_body_view_set_message (MU_MSG_BODY_VIEW(self->_priv->_body),
|
||||||
msg);
|
msg);
|
||||||
|
|
||||||
set_visibility (self, self->_priv->_headers, TRUE);
|
gtk_widget_set_visible (self->_priv->_headers, TRUE);
|
||||||
set_visibility (self, self->_priv->_attachexpander, attachnum > 0);
|
gtk_widget_set_visible (self->_priv->_attachexpander, attachnum > 0);
|
||||||
set_visibility (self, self->_priv->_body, TRUE);
|
gtk_widget_set_visible (self->_priv->_body, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -207,17 +193,14 @@ mu_msg_view_set_message_source (MuMsgView *self, MuMsg *msg)
|
|||||||
{
|
{
|
||||||
g_return_if_fail (MU_IS_MSG_VIEW(self));
|
g_return_if_fail (MU_IS_MSG_VIEW(self));
|
||||||
|
|
||||||
if (self->_priv->_msg)
|
set_message (self, 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),
|
mu_msg_body_view_set_message_source (MU_MSG_BODY_VIEW(self->_priv->_body),
|
||||||
msg);
|
msg);
|
||||||
|
|
||||||
set_visibility (self, self->_priv->_headers, FALSE);
|
gtk_widget_set_visible (self->_priv->_headers, FALSE);
|
||||||
set_visibility (self, self->_priv->_attachexpander, FALSE);
|
gtk_widget_set_visible (self->_priv->_attachexpander, FALSE);
|
||||||
set_visibility (self, self->_priv->_body, TRUE);
|
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));
|
g_return_if_fail (MU_IS_MSG_VIEW(self));
|
||||||
|
|
||||||
set_visibility (self, self->_priv->_headers, FALSE);
|
gtk_widget_set_visible (self->_priv->_headers, FALSE);
|
||||||
set_visibility (self, self->_priv->_attachexpander, FALSE);
|
gtk_widget_set_visible (self->_priv->_attachexpander, FALSE);
|
||||||
set_visibility (self, self->_priv->_body, TRUE);
|
gtk_widget_set_visible (self->_priv->_body, TRUE);
|
||||||
|
|
||||||
mu_msg_body_view_set_note (MU_MSG_BODY_VIEW(self->_priv->_body),
|
mu_msg_body_view_set_note (MU_MSG_BODY_VIEW(self->_priv->_body),
|
||||||
html);
|
html);
|
||||||
|
|||||||
Reference in New Issue
Block a user