diff options
author | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-03-10 11:36:47 +0000 |
---|---|---|
committer | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-03-10 11:36:47 +0000 |
commit | 61dd743ff094b3305f5cd166dcb4d3eca1a8028c (patch) | |
tree | fa099df3fb18cce396b2511ca3d90eb0e8828393 /src | |
parent | 71127ec69c46e0f4b0d02b382f09b1228a7dc63f (diff) |
implemented 'Save this image as...' in the context menu of inline images.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@162 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src')
-rw-r--r-- | src/procmime.c | 27 | ||||
-rw-r--r-- | src/procmime.h | 1 | ||||
-rw-r--r-- | src/textview.c | 78 |
3 files changed, 92 insertions, 14 deletions
diff --git a/src/procmime.c b/src/procmime.c index 2a527774..4cb6545c 100644 --- a/src/procmime.c +++ b/src/procmime.c @@ -851,6 +851,21 @@ gboolean procmime_find_string(MsgInfo *msginfo, const gchar *str, return found; } +gchar *procmime_get_part_file_name(MimeInfo *mimeinfo) +{ + gchar *base; + const gchar *base_; + + base_ = mimeinfo->filename ? mimeinfo->filename + : mimeinfo->name ? mimeinfo->name : "mimetmp"; + base_ = g_basename(base_); + if (*base_ == '\0') base_ = "mimetmp"; + base = conv_filename_from_utf8(base_); + subst_for_filename(base); + + return base; +} + gchar *procmime_get_tmp_file_name(MimeInfo *mimeinfo) { static guint32 id = 0; @@ -864,16 +879,8 @@ gchar *procmime_get_tmp_file_name(MimeInfo *mimeinfo) if (MIME_TEXT_HTML == mimeinfo->mime_type) base = g_strdup("mimetmp.html"); - else { - const gchar *base_; - - base_ = mimeinfo->filename ? mimeinfo->filename - : mimeinfo->name ? mimeinfo->name : "mimetmp"; - base_ = g_basename(base_); - if (*base_ == '\0') base_ = "mimetmp"; - base = conv_filename_from_utf8(base_); - subst_for_filename(base); - } + else + base = procmime_get_part_file_name(mimeinfo); filename = g_strconcat(get_mime_tmp_dir(), G_DIR_SEPARATOR_S, f_prefix, base, NULL); diff --git a/src/procmime.h b/src/procmime.h index 735f59eb..19ccb2a4 100644 --- a/src/procmime.h +++ b/src/procmime.h @@ -174,6 +174,7 @@ gboolean procmime_find_string (MsgInfo *msginfo, const gchar *str, StrFindFunc find_func); +gchar *procmime_get_part_file_name (MimeInfo *mimeinfo); gchar *procmime_get_tmp_file_name (MimeInfo *mimeinfo); ContentType procmime_scan_mime_type (const gchar *mime_type); diff --git a/src/textview.c b/src/textview.c index 8720f62b..5e575945 100644 --- a/src/textview.c +++ b/src/textview.c @@ -50,6 +50,7 @@ #include "html.h" #include "compose.h" #include "displayheader.h" +#include "filesel.h" #include "alertpanel.h" typedef struct _RemoteURI RemoteURI; @@ -58,6 +59,8 @@ struct _RemoteURI { gchar *uri; + gchar *filename; + guint start; guint end; }; @@ -186,6 +189,9 @@ static void textview_populate_popup (GtkWidget *widget, TextView *textview); static void textview_popup_menu_activate_copy_cb(GtkMenuItem *menuitem, gpointer data); +static void textview_popup_menu_activate_image_cb + (GtkMenuItem *menuitem, + gpointer data); static void textview_smooth_scroll_do (TextView *textview, gfloat old_value, @@ -602,6 +608,8 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp) GdkPixbuf *pixbuf; GError *error = NULL; gchar *filename; + RemoteURI *uri; + gchar *uri_str; filename = procmime_get_tmp_file_name(mimeinfo); if (procmime_get_part_fp(filename, fp, mimeinfo) < 0) { @@ -611,13 +619,13 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp) } pixbuf = gdk_pixbuf_new_from_file(filename, &error); - g_free(filename); if (error != NULL) { g_warning("%s\n", error->message); g_error_free(error); } if (!pixbuf) { g_warning("Can't load the image."); + g_free(filename); return; } @@ -630,10 +638,22 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp) pixbuf = scaled; } + uri_str = g_filename_to_uri(filename, NULL, NULL); + if (uri_str) { + uri = g_new(RemoteURI, 1); + uri->uri = uri_str; + uri->filename = + procmime_get_part_file_name(mimeinfo); + uri->start = gtk_text_iter_get_offset(&iter); + uri->end = uri->start + 1; + textview->uri_list = + g_slist_append(textview->uri_list, uri); + } gtk_text_buffer_insert_pixbuf(buffer, &iter, pixbuf); gtk_text_buffer_insert(buffer, &iter, "\n", 1); g_object_unref(pixbuf); + g_free(filename); } } else { if (!mimeinfo->main && @@ -962,6 +982,7 @@ static void textview_make_clickable_parts(TextView *textview, fg_tag, NULL); uri->uri = parser[last->pti].build_uri(last->bp, last->ep); + uri->filename = NULL; uri->start = gtk_text_iter_get_offset(&iter); gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, last->bp, last->ep - last->bp, @@ -1061,6 +1082,7 @@ void textview_write_link(TextView *textview, const gchar *str, r_uri = g_new(RemoteURI, 1); r_uri->uri = g_strdup(uri); + r_uri->filename = NULL; r_uri->start = gtk_text_iter_get_offset(&iter); gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, bufp, -1, "link", NULL); @@ -1791,6 +1813,7 @@ static void textview_populate_popup(GtkWidget *widget, GtkMenu *menu, GtkTextIter iter, start, end; gboolean on_link; RemoteURI *uri; + GdkPixbuf *pixbuf; buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); @@ -1799,6 +1822,24 @@ static void textview_populate_popup(GtkWidget *widget, GtkMenu *menu, GTK_TEXT_WINDOW_WIDGET, px, py, &x, &y); gtk_text_view_get_iter_at_location(GTK_TEXT_VIEW(widget), &iter, x, y); + if ((pixbuf = gtk_text_iter_get_pixbuf(&iter)) != NULL) { + start = end = iter; + gtk_text_iter_forward_char(&end); + uri = textview_get_uri(textview, &start, &end); + + separator = gtk_separator_menu_item_new(); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), separator); + gtk_widget_show(separator); + + menuitem = gtk_menu_item_new_with_mnemonic + (_("Sa_ve this image as...")); + g_signal_connect + (menuitem, "activate", + G_CALLBACK(textview_popup_menu_activate_image_cb), + uri); + gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); + gtk_widget_show(menuitem); + } on_link = textview_get_link_tag_bounds(textview, &iter, &start, &end); if (!on_link) return; @@ -1841,6 +1882,32 @@ static void textview_popup_menu_activate_copy_cb(GtkMenuItem *menuitem, gtk_clipboard_set_text(clipboard, uri_string, -1); } +static void textview_popup_menu_activate_image_cb(GtkMenuItem *menuitem, + gpointer data) +{ + RemoteURI *uri = (RemoteURI *)data; + gchar *src; + gchar *dest; + gchar *filename; + + g_return_if_fail(uri != NULL); + + if (!uri->uri) + return; + + src = g_filename_from_uri(uri->uri, NULL, NULL); + g_return_if_fail(src != NULL); + + filename = conv_filename_to_utf8(uri->filename); + dest = filesel_save_as(filename); + if (dest) { + copy_file(src, dest, FALSE); + g_free(dest); + } + g_free(filename); + g_free(src); +} + static gboolean textview_uri_security_check(TextView *textview, RemoteURI *uri) { GtkTextBuffer *buffer; @@ -1894,9 +1961,12 @@ static void textview_uri_list_remove_all(GSList *uri_list) GSList *cur; for (cur = uri_list; cur != NULL; cur = cur->next) { - if (cur->data) { - g_free(((RemoteURI *)cur->data)->uri); - g_free(cur->data); + RemoteURI *uri = (RemoteURI *)cur->data; + + if (uri) { + g_free(uri->uri); + g_free(uri->filename); + g_free(uri); } } |