[evolution/webkit] Bug #641374 - "Send new mail to..." popup action doesn't work



commit 946e307ee510d035163dbf8da67d09b1388d54e0
Author: Milan Crha <mcrha redhat com>
Date:   Mon Feb 28 13:54:50 2011 +0100

    Bug #641374 - "Send new mail to..." popup action doesn't work

 mail/e-mail-display.c     |   54 +++++++++++++++++++++++++++++++-------------
 widgets/misc/e-web-view.c |   18 ++++++++++++++-
 widgets/misc/e-web-view.h |    1 +
 3 files changed, 56 insertions(+), 17 deletions(-)
---
diff --git a/mail/e-mail-display.c b/mail/e-mail-display.c
index d13eca3..7fc1694 100644
--- a/mail/e-mail-display.c
+++ b/mail/e-mail-display.c
@@ -228,6 +228,41 @@ mail_display_url_requested (GtkHTML *html,
 	 *     until EMFormatHTML is made asynchronous. */
 }
 
+static gboolean
+mail_display_process_mailto (EWebView *web_view, const gchar *mailto_uri)
+{
+	g_return_val_if_fail (web_view != NULL, FALSE);
+	g_return_val_if_fail (mailto_uri != NULL, FALSE);
+	g_return_val_if_fail (E_IS_MAIL_DISPLAY (web_view), FALSE);
+
+	if (g_ascii_strncasecmp (mailto_uri, "mailto:";, 7) == 0) {
+		EMailDisplayPrivate *priv;
+		EMFormat *format;
+		CamelFolder *folder = NULL;
+		const gchar *folder_uri = NULL;
+		EShell *shell;
+
+		priv = E_MAIL_DISPLAY (web_view)->priv;
+		g_return_val_if_fail (priv->formatter != NULL, FALSE);
+
+		format = EM_FORMAT (priv->formatter);
+
+		if (format != NULL && format->folder != NULL)
+			folder = format->folder;
+
+		if (folder != NULL)
+			folder_uri = camel_folder_get_uri (folder);
+
+		shell = e_shell_get_default ();
+		em_utils_compose_new_message_with_mailto (
+			shell, mailto_uri, folder_uri);
+
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
 static void
 mail_display_link_clicked (GtkHTML *html,
                            const gchar *uri)
@@ -262,22 +297,8 @@ mail_display_link_clicked (GtkHTML *html,
 		priv->formatter->header_wrap_flags = flags;
 		em_format_queue_redraw (EM_FORMAT (priv->formatter));
 
-	} else if (g_ascii_strncasecmp (uri, "mailto:";, 7) == 0) {
-		EMFormat *format = EM_FORMAT (priv->formatter);
-		CamelFolder *folder = NULL;
-		const gchar *folder_uri = NULL;
-		EShell *shell;
-
-		if (format != NULL && format->folder != NULL)
-			folder = format->folder;
-
-		if (folder != NULL)
-			folder_uri = camel_folder_get_uri (folder);
-
-		shell = e_shell_get_default ();
-		em_utils_compose_new_message_with_mailto (
-			shell, uri, folder_uri);
-
+	} else if (mail_display_process_mailto (E_WEB_VIEW (html), uri)) {
+		/* do nothing, function handled the "mailto:"; uri already */
 	} else if (*uri == '#')
 		gtk_html_jump_to_anchor (html, uri + 1);
 
@@ -315,6 +336,7 @@ mail_display_class_init (EMailDisplayClass *class)
 
 	web_view_class = E_WEB_VIEW_CLASS (class);
 	web_view_class->load_string = mail_display_load_string;
+	web_view_class->process_mailto = mail_display_process_mailto;
 
 	html_class = GTK_HTML_CLASS (class);
 	html_class->url_requested = mail_display_url_requested;
diff --git a/widgets/misc/e-web-view.c b/widgets/misc/e-web-view.c
index e559789..ccbd4cc 100644
--- a/widgets/misc/e-web-view.c
+++ b/widgets/misc/e-web-view.c
@@ -81,6 +81,7 @@ enum {
 	STATUS_MESSAGE,
 	STOP_LOADING,
 	UPDATE_ACTIONS,
+	PROCESS_MAILTO,
 	LAST_SIGNAL
 };
 
@@ -323,6 +324,7 @@ action_send_message_cb (GtkAction *action,
 {
 	const gchar *uri;
 	gpointer parent;
+	gboolean handled;
 
 	parent = gtk_widget_get_toplevel (GTK_WIDGET (web_view));
 	parent = gtk_widget_is_toplevel (parent) ? parent : NULL;
@@ -330,7 +332,11 @@ action_send_message_cb (GtkAction *action,
 	uri = e_web_view_get_selected_uri (web_view);
 	g_return_if_fail (uri != NULL);
 
-	e_show_uri (parent, uri);
+	handled = FALSE;
+	g_signal_emit (web_view, signals[PROCESS_MAILTO], 0, uri, &handled);
+
+	if (!handled)
+		e_show_uri (parent, uri);
 }
 
 static void
@@ -1296,6 +1302,16 @@ e_web_view_class_init (EWebViewClass *class)
 		NULL, NULL,
 		g_cclosure_marshal_VOID__VOID,
 		G_TYPE_NONE, 0);
+
+	/* return TRUE when a signal handler processed the mailto URI */
+	signals[PROCESS_MAILTO] = g_signal_new (
+		"process-mailto",
+		G_TYPE_FROM_CLASS (class),
+		G_SIGNAL_RUN_LAST,
+		G_STRUCT_OFFSET (EWebViewClass, process_mailto),
+		NULL, NULL,
+		e_marshal_BOOLEAN__STRING,
+		G_TYPE_BOOLEAN, 1, G_TYPE_STRING);
 }
 
 static void
diff --git a/widgets/misc/e-web-view.h b/widgets/misc/e-web-view.h
index 82a4521..356a556 100644
--- a/widgets/misc/e-web-view.h
+++ b/widgets/misc/e-web-view.h
@@ -88,6 +88,7 @@ struct _EWebViewClass {
 						 const gchar *status_message);
 	void		(*stop_loading)		(EWebView *web_view);
 	void		(*update_actions)	(EWebView *web_view);
+	gboolean	(*process_mailto)	(EWebView *web_view, const gchar *mailto_uri);
 };
 
 GType		e_web_view_get_type		(void);



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