aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--modules/mdn/evolution-mdn.c78
1 files changed, 71 insertions, 7 deletions
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 <mail/em-utils.h>
#include <mail/e-mail-reader.h>
#include <mail/mail-send-recv.h>
+#include <mail/message-list.h>
#include <mail/em-composer-utils.h>
#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 *
@@ -399,9 +432,24 @@ mdn_notify_action_cb (GtkAction *action,
}
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);
@@ -525,8 +575,12 @@ mdn_constructed (GObject *object)
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",
@@ -537,6 +591,15 @@ mdn_constructed (GObject *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)
{
GObjectClass *object_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;