[Commits] [SCM] claws branch, master, updated. 3.17.3-126-g9fb890d
ticho at claws-mail.org
ticho at claws-mail.org
Wed Mar 6 00:22:01 CET 2019
The branch, master has been updated
via 9fb890dee9461adf155c1048afe73501c527796f (commit)
from 55717767b62cf673760d72e1d8ddf02685103e6e (commit)
Summary of changes:
src/textview.c | 248 ++++++++------------------------------------------------
1 file changed, 34 insertions(+), 214 deletions(-)
- Log -----------------------------------------------------------------
commit 9fb890dee9461adf155c1048afe73501c527796f
Author: Andrej Kacian <ticho at claws-mail.org>
Date: Tue Mar 5 23:13:29 2019 +0100
Make textview load image attachments not via temporary files
This causes a change in how interacting with the image
attachments works. Previously, clicking the
"[attachment info]" clickable line above the image would
do different actions than clicking the image itself, which
would have an URI pointing to a temporary image file.
Now, they both do the same thing - left-click selects
the attachment, right-click shows generic attachment
context menu.
diff --git a/src/textview.c b/src/textview.c
index bfa6382..ee3c213 100644
--- a/src/textview.c
+++ b/src/textview.c
@@ -234,10 +234,6 @@ static void mail_to_uri_cb (GtkAction *action,
TextView *textview);
static void copy_mail_to_uri_cb (GtkAction *action,
TextView *textview);
-static void save_file_cb (GtkAction *action,
- TextView *textview);
-static void open_image_cb (GtkAction *action,
- TextView *textview);
static void textview_show_tags(TextView *textview);
static GtkActionEntry textview_link_popup_entries[] =
@@ -256,13 +252,6 @@ static GtkActionEntry textview_mail_popup_entries[] =
{"TextviewPopupMail/Copy", NULL, N_("Copy this add_ress"), NULL, NULL, G_CALLBACK(copy_mail_to_uri_cb) },
};
-static GtkActionEntry textview_file_popup_entries[] =
-{
- {"TextviewPopupFile", NULL, "TextviewPopupFile", NULL, NULL, NULL },
- {"TextviewPopupFile/Open", NULL, N_("_Open image"), NULL, NULL, G_CALLBACK(open_image_cb) },
- {"TextviewPopupFile/Save", NULL, N_("_Save image..."), NULL, NULL, G_CALLBACK(save_file_cb) },
-};
-
static void scrolled_cb (GtkAdjustment *adj, TextView *textview)
{
#ifndef WIDTH
@@ -365,18 +354,12 @@ TextView *textview_create(void)
"TextviewPopupMail",
textview_mail_popup_entries,
G_N_ELEMENTS(textview_mail_popup_entries), (gpointer)textview);
- textview->file_action_group = cm_menu_create_action_group_full(textview->ui_manager,
- "TextviewPopupFile",
- textview_file_popup_entries,
- G_N_ELEMENTS(textview_file_popup_entries), (gpointer)textview);
MENUITEM_ADDUI_MANAGER(textview->ui_manager, "/", "Menus", "Menus", GTK_UI_MANAGER_MENUBAR)
MENUITEM_ADDUI_MANAGER(textview->ui_manager,
"/Menus", "TextviewPopupLink", "TextviewPopupLink", GTK_UI_MANAGER_MENU)
MENUITEM_ADDUI_MANAGER(textview->ui_manager,
"/Menus", "TextviewPopupMail", "TextviewPopupMail", GTK_UI_MANAGER_MENU)
- MENUITEM_ADDUI_MANAGER(textview->ui_manager,
- "/Menus", "TextviewPopupFile", "TextviewPopupFile", GTK_UI_MANAGER_MENU)
MENUITEM_ADDUI_MANAGER(textview->ui_manager,
"/Menus/TextviewPopupLink", "Open", "TextviewPopupLink/Open", GTK_UI_MANAGER_MENUITEM)
@@ -390,17 +373,11 @@ TextView *textview_create(void)
"/Menus/TextviewPopupMail", "AddAB", "TextviewPopupMail/AddAB", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(textview->ui_manager,
"/Menus/TextviewPopupMail", "Copy", "TextviewPopupMail/Copy", GTK_UI_MANAGER_MENUITEM)
- MENUITEM_ADDUI_MANAGER(textview->ui_manager,
- "/Menus/TextviewPopupFile", "Open", "TextviewPopupFile/Open", GTK_UI_MANAGER_MENUITEM)
- MENUITEM_ADDUI_MANAGER(textview->ui_manager,
- "/Menus/TextviewPopupFile", "Save", "TextviewPopupFile/Save", GTK_UI_MANAGER_MENUITEM)
textview->link_popup_menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
gtk_ui_manager_get_widget(textview->ui_manager, "/Menus/TextviewPopupLink")) );
textview->mail_popup_menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
gtk_ui_manager_get_widget(textview->ui_manager, "/Menus/TextviewPopupMail")) );
- textview->file_popup_menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
- gtk_ui_manager_get_widget(textview->ui_manager, "/Menus/TextviewPopupFile")) );
textview->vbox = vbox;
textview->scrolledwin = scrolledwin;
@@ -740,32 +717,29 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo)
prefs_common.inline_img ) {
GdkPixbuf *pixbuf;
GError *error = NULL;
- gchar *filename;
ClickableText *uri;
- gchar *uri_str;
- gint err;
- START_TIMING("inserting image");
+ GInputStream *stream;
- filename = procmime_get_tmp_file_name(mimeinfo);
+ START_TIMING("inserting image");
- if ((err = procmime_get_part(filename, mimeinfo)) < 0) {
- g_warning("Can't get the image file.(%s)", g_strerror(-err));
- g_free(filename);
+ stream = procmime_get_part_as_inputstream(mimeinfo, &error);
+ if (error != NULL) {
+ g_warning("Can't get the image file: %s", error->message);
+ g_error_free(error);
END_TIMING();
return;
}
- pixbuf = gdk_pixbuf_new_from_file(filename, &error);
- if (textview->stop_loading) {
- return;
- }
+ pixbuf = gdk_pixbuf_new_from_stream(stream, NULL, &error);
+ g_object_unref(stream);
+
if (error != NULL) {
- g_warning("%s", error->message);
+ g_warning("Can't load the image: %s\n", error->message);
g_error_free(error);
+ END_TIMING();
+ return;
}
- if (!pixbuf) {
- g_warning("Can't load the image.");
- g_free(filename);
+ if (textview->stop_loading) {
END_TIMING();
return;
}
@@ -776,39 +750,32 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo)
allocation.height);
if (textview->stop_loading) {
+ END_TIMING();
return;
}
- uri_str = g_filename_to_uri(filename, NULL, NULL);
- if (uri_str) {
- uri = g_new0(ClickableText, 1);
- uri->uri = uri_str;
- uri->start = gtk_text_iter_get_offset(&iter);
-
- gtk_text_buffer_insert_pixbuf(buffer, &iter, pixbuf);
- if (textview->stop_loading) {
- g_free(uri);
- return;
- }
- uri->end = uri->start + 1;
- uri->filename = procmime_get_part_file_name(mimeinfo);
- textview->uri_list =
- g_slist_prepend(textview->uri_list, uri);
-
- gtk_text_buffer_insert(buffer, &iter, " ", 1);
- gtk_text_buffer_get_iter_at_offset(buffer, &start_iter, uri->start);
- gtk_text_buffer_apply_tag_by_name(buffer, "link",
- &start_iter, &iter);
- } else {
- gtk_text_buffer_insert_pixbuf(buffer, &iter, pixbuf);
- if (textview->stop_loading) {
- return;
- }
- gtk_text_buffer_insert(buffer, &iter, " ", 1);
- }
+ uri = g_new0(ClickableText, 1);
+ uri->uri = g_strdup("");
+ uri->filename = g_strdup("sc://select_attachment");
+ uri->data = mimeinfo;
+ uri->start = gtk_text_iter_get_offset(&iter);
+ gtk_text_buffer_insert_pixbuf(buffer, &iter, pixbuf);
g_object_unref(pixbuf);
- g_free(filename);
+ if (textview->stop_loading) {
+ g_free(uri);
+ return;
+ }
+ uri->end = gtk_text_iter_get_offset(&iter);
+
+ textview->uri_list =
+ g_slist_prepend(textview->uri_list, uri);
+
+ gtk_text_buffer_insert(buffer, &iter, " ", 1);
+ gtk_text_buffer_get_iter_at_offset(buffer, &start_iter, uri->start);
+ gtk_text_buffer_apply_tag_by_name(buffer, "link",
+ &start_iter, &iter);
+
END_TIMING();
GTK_EVENTS_FLUSH();
}
@@ -3003,153 +2970,6 @@ static void open_uri_cb (GtkAction *action, TextView *textview)
}
}
-static void open_image_cb (GtkAction *action, TextView *textview)
-{
- ClickableText *uri = g_object_get_data(G_OBJECT(textview->file_popup_menu),
- "menu_button");
-
- gchar *cmd = NULL;
- gchar buf[1024];
- const gchar *p;
- gchar *filename = NULL, *filepath = NULL;
- gchar *tmp_filename = NULL;
-
- if (uri == NULL)
- return;
-
- if (uri->filename == NULL)
- return;
-
- filename = g_strdup(uri->filename);
-
- if (!g_utf8_validate(filename, -1, NULL)) {
- gchar *tmp = conv_filename_to_utf8(filename);
- g_free(filename);
- filename = tmp;
- }
-
- subst_for_filename(filename);
-
- filepath = g_strconcat(get_mime_tmp_dir(), G_DIR_SEPARATOR_S,
- filename, NULL);
-
- tmp_filename = g_filename_from_uri(uri->uri, NULL, NULL);
- copy_file(tmp_filename, filepath, FALSE);
- g_free(tmp_filename);
-
- cmd = mailcap_get_command_for_type("image/jpeg", filename);
- if (cmd == NULL) {
- gboolean remember = FALSE;
- cmd = input_dialog_combo_remember
- (_("Open with"),
- _("Enter the command-line to open file:\n"
- "('%s' will be replaced with file name)"),
- prefs_common.mime_open_cmd,
- prefs_common.mime_open_cmd_history,
- &remember);
- if (cmd && remember) {
- mailcap_update_default("image/jpeg", cmd);
- }
- }
- if (cmd && (p = strchr(cmd, '%')) && *(p + 1) == 's' &&
- !strchr(p + 2, '%'))
- g_snprintf(buf, sizeof(buf), cmd, filepath);
- else {
- g_warning("Image viewer command-line is invalid: '%s'", cmd);
- g_free(filepath);
- g_free(filename);
- return;
- }
-
- execute_command_line(buf, TRUE, NULL);
-
- g_free(filepath);
- g_free(filename);
- g_free(cmd);
-
- g_object_set_data(G_OBJECT(textview->file_popup_menu), "menu_button",
- NULL);
-}
-
-static void save_file_cb (GtkAction *action, TextView *textview)
-{
- ClickableText *uri = g_object_get_data(G_OBJECT(textview->file_popup_menu),
- "menu_button");
- gchar *filename = NULL;
- gchar *filepath = NULL;
- gchar *filedir = NULL;
- gchar *tmp_filename = NULL;
- GtkWidget *window;
-
- if (uri == NULL)
- return;
-
- if (uri->filename == NULL)
- return;
-
- filename = g_strdup(uri->filename);
-
- if (!g_utf8_validate(filename, -1, NULL)) {
- gchar *tmp = conv_filename_to_utf8(filename);
- g_free(filename);
- filename = tmp;
- }
-
- subst_for_filename(filename);
-
- if (prefs_common.attach_save_dir && *prefs_common.attach_save_dir)
- filepath = g_strconcat(prefs_common.attach_save_dir,
- G_DIR_SEPARATOR_S, filename, NULL);
- else
- filepath = g_strconcat(get_home_dir(), G_DIR_SEPARATOR_S,
- filename, NULL);
-
- g_free(filename);
-
- /* Pick correct window to set the file dialog "transient for" */
- if (textview->messageview->window != NULL)
- window = textview->messageview->window;
- else
- window = textview->messageview->mainwin->window;
-
- manage_window_focus_in(window, NULL, NULL);
-
- filename = filesel_select_file_save(_("Save as"), filepath);
- if (!filename) {
- g_free(filepath);
- return;
- }
-
- if (is_file_exist(filename)) {
- AlertValue aval;
- gchar *res;
-
- res = g_strdup_printf(_("Overwrite existing file '%s'?"),
- filename);
- aval = alertpanel(_("Overwrite"), res, GTK_STOCK_CANCEL,
- GTK_STOCK_OK, NULL, ALERTFOCUS_FIRST);
- g_free(res);
- if (G_ALERTALTERNATE != aval)
- return;
- }
-
- tmp_filename = g_filename_from_uri(uri->uri, NULL, NULL);
- copy_file(tmp_filename, filename, FALSE);
- g_free(tmp_filename);
-
- filedir = g_path_get_dirname(filename);
- if (filedir && strcmp(filedir, ".")) {
- g_free(prefs_common.attach_save_dir);
- prefs_common.attach_save_dir = g_filename_to_utf8(filedir, -1, NULL, NULL, NULL);
- }
-
- g_free(filedir);
- g_free(filepath);
-
- g_object_set_data(G_OBJECT(textview->file_popup_menu), "menu_button",
- NULL);
-}
-
static void copy_uri_cb (GtkAction *action, TextView *textview)
{
ClickableText *uri = g_object_get_data(G_OBJECT(textview->link_popup_menu),
-----------------------------------------------------------------------
hooks/post-receive
--
Claws Mail
More information about the Commits
mailing list