From dbe798bd9a4f54b76968d16931178ab1c683e90d Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Wed, 2 Jan 2008 12:35:38 +0000 Subject: ** Fix for bug #317823 2008-01-02 Milan Crha ** Fix for bug #317823 * em-format-html-display.c: (efhd_get_uri_puri): New helper function to dig up uri or puri from the GtkHtml. If the object is an image, then pass it as puri or uri, depends on the source of the image. * em-format-html-display.c: (efhd_html_button_press_event), (em_format_html_display_popup_menu): Using new helper function. Note: New API functions in gtkhtml are required. svn path=/trunk/; revision=34750 --- mail/em-format-html-display.c | 64 +++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 18 deletions(-) (limited to 'mail/em-format-html-display.c') diff --git a/mail/em-format-html-display.c b/mail/em-format-html-display.c index eb06d8a095..8589564bd6 100644 --- a/mail/em-format-html-display.c +++ b/mail/em-format-html-display.c @@ -837,31 +837,62 @@ efhd_iframe_created(GtkHTML *html, GtkHTML *iframe, EMFormatHTMLDisplay *efh) return; } +static void +efhd_get_uri_puri (GtkWidget *html, GdkEventButton *event, EMFormatHTMLDisplay *efhd, char **uri, EMFormatPURI **puri) +{ + char *url, *img_url; + + g_return_if_fail (html != NULL); + g_return_if_fail (GTK_IS_HTML (html)); + g_return_if_fail (efhd != NULL); + + if (event) { + url = gtk_html_get_url_at (GTK_HTML (html), event->x, event->y); + img_url = gtk_html_get_image_src_at (GTK_HTML (html), event->x, event->y); + } else { + url = gtk_html_get_cursor_url (GTK_HTML (html)); + img_url = gtk_html_get_cursor_image_src (GTK_HTML (html)); + } + + if (!url && img_url) { + if (strstr (img_url, "://") || g_ascii_strncasecmp (img_url, "cid:", 4) == 0) { + url = img_url; + img_url = NULL; + } else + url = g_strconcat ("file://", img_url, NULL); + } + + if (url && puri) + *puri = em_format_find_puri((EMFormat *)efhd, url); + + if (uri) { + *uri = url; + url = NULL; + } +} + static int efhd_html_button_press_event (GtkWidget *widget, GdkEventButton *event, EMFormatHTMLDisplay *efhd) { - char *uri; - gboolean res = FALSE; + char *uri = NULL; EMFormatPURI *puri = NULL; + gboolean res = FALSE; if (event->button != 3) return FALSE; - uri = gtk_html_get_url_at (GTK_HTML (widget), event->x, event->y); - d(printf("popup button pressed\n")); - if (uri && !strncmp (uri, "##", 2)) - return TRUE; + efhd_get_uri_puri (widget, event, efhd, &uri, &puri); - if (uri) { - puri = em_format_find_puri((EMFormat *)efhd, uri); - d(printf("poup event, uri = '%s' part = '%p'\n", uri, puri?puri->part:NULL)); + if (uri && !strncmp (uri, "##", 2)) { + g_free (uri); + return TRUE; } g_signal_emit((GtkObject *)efhd, efhd_signals[EFHD_POPUP_EVENT], 0, event, uri, puri?puri->part:NULL, &res); - g_free(uri); + g_free (uri); return res; } @@ -870,20 +901,17 @@ gboolean em_format_html_display_popup_menu (EMFormatHTMLDisplay *efhd) { GtkHTML *html; - char *url; - gboolean res = FALSE; + char *uri = NULL; EMFormatPURI *puri = NULL; + gboolean res = FALSE; html = efhd->formathtml.html; - url = gtk_html_get_cursor_url (html); - - if (url) - puri = em_format_find_puri((EMFormat *)efhd, url); + efhd_get_uri_puri (GTK_WIDGET (html), NULL, efhd, &uri, &puri); - g_signal_emit((GtkObject *)efhd, efhd_signals[EFHD_POPUP_EVENT], 0, NULL, url, puri?puri->part:NULL, &res); + g_signal_emit ((GtkObject *)efhd, efhd_signals[EFHD_POPUP_EVENT], 0, NULL, uri, puri?puri->part:NULL, &res); - g_free(url); + g_free (uri); return res; } -- cgit v1.2.3