From 55c1946220af0653c70fe42c6db8dfc169798e8a Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Mon, 23 Apr 2012 17:45:14 +0200 Subject: Bug #668687 - MDN panel left shown when moving to an empty folder --- modules/mdn/evolution-mdn.c | 78 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 7 deletions(-) (limited to 'modules') diff --git a/modules/mdn/evolution-mdn.c b/modules/mdn/evolution-mdn.c index fdb7c18e55..30bdc314c5 100644 --- a/modules/mdn/evolution-mdn.c +++ b/modules/mdn/evolution-mdn.c @@ -31,12 +31,26 @@ #include #include #include +#include #include #define MDN_USER_FLAG "receipt-handled" -typedef EExtension EMdn; -typedef EExtensionClass EMdnClass; +#define E_TYPE_MDN (e_mdn_get_type ()) +#define E_MDN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_MDN, EMdn)) +#define E_IS_MDN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_MDN)) + +typedef struct _EMdn EMdn; +typedef struct _EMdnClass EMdnClass; + +struct _EMdn { + EExtension parent; + gpointer alert; /* weak pointer */ +}; + +struct _EMdnClass { + EExtensionClass parent_class; +}; typedef struct _MdnContext MdnContext; @@ -86,15 +100,34 @@ mdn_context_free (MdnContext *context) } static void -mdn_submit_alert (EMailReader *reader, +mdn_remove_alert (EMdn *mdn) +{ + g_return_if_fail (E_IS_MDN (mdn)); + + if (mdn->alert != NULL) + e_alert_response (mdn->alert, GTK_RESPONSE_OK); +} + +static void +mdn_submit_alert (EMdn *mdn, + EMailReader *reader, EAlert *alert) { EPreviewPane *preview_pane; + g_return_if_fail (E_IS_MDN (mdn)); + + mdn_remove_alert (mdn); + + g_return_if_fail (mdn->alert == NULL); + /* Make sure alerts are shown in the preview pane and not * wherever e_mail_reader_get_alert_sink() might show it. */ preview_pane = e_mail_reader_get_preview_pane (reader); e_alert_sink_submit_alert (E_ALERT_SINK (preview_pane), alert); + + mdn->alert = alert; + g_object_add_weak_pointer (G_OBJECT (mdn->alert), &mdn->alert); } static gchar * @@ -398,10 +431,25 @@ mdn_notify_action_cb (GtkAction *action, context->info = NULL; } +static void +mdn_mail_reader_changed_cb (EMailReader *reader, + EMdn *mdn) +{ + MessageList *message_list; + + g_return_if_fail (E_IS_MAIL_READER (reader)); + + message_list = MESSAGE_LIST (e_mail_reader_get_message_list (reader)); + + if (!message_list || message_list_selected_count (message_list) != 1) + mdn_remove_alert (mdn); +} + static void mdn_message_loaded_cb (EMailReader *reader, const gchar *message_uid, - CamelMimeMessage *message) + CamelMimeMessage *message, + EMdn *mdn) { EAlert *alert; EAccount *account; @@ -411,13 +459,15 @@ mdn_message_loaded_cb (EMailReader *reader, folder = e_mail_reader_get_folder (reader); + mdn_remove_alert (mdn); + info = camel_folder_get_message_info (folder, message_uid); if (info == NULL) return; if (camel_message_info_user_flag (info, MDN_USER_FLAG)) { alert = e_alert_new ("mdn:sender-notified", NULL); - mdn_submit_alert (reader, alert); + mdn_submit_alert (mdn, reader, alert); g_object_unref (alert); goto exit; } @@ -463,7 +513,7 @@ mdn_message_loaded_cb (EMailReader *reader, alert = e_alert_new ("mdn:notify-sender", NULL); e_alert_add_action (alert, action, GTK_RESPONSE_APPLY); - mdn_submit_alert (reader, alert); + mdn_submit_alert (mdn, reader, alert); g_object_unref (alert); g_object_unref (action); @@ -524,9 +574,13 @@ mdn_constructed (GObject *object) extensible = e_extension_get_extensible (extension); g_return_if_fail (E_IS_MAIL_READER (extensible)); + g_signal_connect ( + extensible, "changed", + G_CALLBACK (mdn_mail_reader_changed_cb), extension); + g_signal_connect ( extensible, "message-loaded", - G_CALLBACK (mdn_message_loaded_cb), NULL); + G_CALLBACK (mdn_message_loaded_cb), extension); g_signal_connect ( extensible, "message-seen", @@ -536,6 +590,15 @@ mdn_constructed (GObject *object) G_OBJECT_CLASS (e_mdn_parent_class)->constructed (object); } +static void +mdn_dispose (GObject *object) +{ + mdn_remove_alert (E_MDN (object)); + + /* Chain up to parent's dispose() method. */ + G_OBJECT_CLASS (e_mdn_parent_class)->dispose (object); +} + static void e_mdn_class_init (EMdnClass *class) { @@ -544,6 +607,7 @@ e_mdn_class_init (EMdnClass *class) object_class = G_OBJECT_CLASS (class); object_class->constructed = mdn_constructed; + object_class->dispose = mdn_dispose; extension_class = E_EXTENSION_CLASS (class); extension_class->extensible_type = E_TYPE_MAIL_READER; -- cgit v1.2.3