From c2b43b3f3024bb6106a17159065404b4716b57f1 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Tue, 13 Feb 2018 18:35:50 +0100 Subject: [PATCH] Bug 793240 - Let open attachments in default application easily --- src/e-util/e-attachment.c | 24 ++++++++++++- src/e-util/e-attachment.h | 1 + src/em-format/e-mail-formatter-attachment.c | 7 ++-- src/mail/e-mail-display.c | 56 +++++++++++++++++++++++++++-- 4 files changed, 82 insertions(+), 6 deletions(-) diff --git a/src/e-util/e-attachment.c b/src/e-util/e-attachment.c index 511c7d28e9..156e95c35a 100644 --- a/src/e-util/e-attachment.c +++ b/src/e-util/e-attachment.c @@ -1684,6 +1684,28 @@ e_attachment_is_rfc822 (EAttachment *attachment) return is_rfc822; } +GAppInfo * +e_attachment_ref_default_app (EAttachment *attachment) +{ + GFileInfo *file_info; + GAppInfo *default_app = NULL; + const gchar *content_type; + + g_return_val_if_fail (E_IS_ATTACHMENT (attachment), NULL); + + file_info = e_attachment_ref_file_info (attachment); + if (file_info == NULL) + return NULL; + + content_type = g_file_info_get_content_type (file_info); + if (content_type && !g_content_type_equals (content_type, "application/octet-stream")) + default_app = g_app_info_get_default_for_type (content_type, FALSE); + + g_object_unref (file_info); + + return default_app; +} + GList * e_attachment_list_apps (EAttachment *attachment) { @@ -1721,7 +1743,7 @@ e_attachment_list_apps (EAttachment *attachment) g_free (allocated); exit: - default_app = g_app_info_get_default_for_type (content_type, FALSE); + default_app = e_attachment_ref_default_app (attachment); if (default_app) { GList *link; diff --git a/src/e-util/e-attachment.h b/src/e-util/e-attachment.h index 5fa662e320..2a060a76f6 100644 --- a/src/e-util/e-attachment.h +++ b/src/e-util/e-attachment.h @@ -128,6 +128,7 @@ gchar * e_attachment_dup_description (EAttachment *attachment); gchar * e_attachment_dup_thumbnail_path (EAttachment *attachment); gboolean e_attachment_is_rfc822 (EAttachment *attachment); GList * e_attachment_list_apps (EAttachment *attachment); +GAppInfo * e_attachment_ref_default_app (EAttachment *attachment); void e_attachment_update_store_columns (EAttachment *attachment); diff --git a/src/em-format/e-mail-formatter-attachment.c b/src/em-format/e-mail-formatter-attachment.c index ad12eeb9cb..8e88efefb5 100644 --- a/src/em-format/e-mail-formatter-attachment.c +++ b/src/em-format/e-mail-formatter-attachment.c @@ -260,7 +260,7 @@ emfe_attachment_format (EMailFormatterExtension *extension, "" "" "", - part_id, attachment_ptr, html, e_mail_part_attachment_get_expandable (empa) ? "" : "disabled", - attachment_ptr, e_mail_part_should_show_inline (part) ? "go-down" : "go-next", GTK_ICON_SIZE_BUTTON, icon_width, icon_height, + part_id, attachment_ptr, html, attachment_ptr, + e_mail_part_should_show_inline (part) ? "go-down" : e_mail_part_attachment_get_expandable (empa) ? "go-next" : "go-top", + GTK_ICON_SIZE_BUTTON, icon_width, icon_height, icon_uri, icon_width, icon_height, part_id, attachment_ptr, GTK_ICON_SIZE_BUTTON, icon_width, icon_height, html); diff --git a/src/mail/e-mail-display.c b/src/mail/e-mail-display.c index 126f8f931e..b7d00a11b2 100644 --- a/src/mail/e-mail-display.c +++ b/src/mail/e-mail-display.c @@ -875,6 +875,21 @@ mail_display_ref_attachment_from_element (EMailDisplay *display, } static void +call_attachment_save_handle_error (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +{ + GtkWindow *window = user_data; + + g_return_if_fail (E_IS_ATTACHMENT (source_object)); + g_return_if_fail (!window || GTK_IS_WINDOW (window)); + + e_attachment_save_handle_error (E_ATTACHMENT (source_object), result, window); + + g_clear_object (&window); +} + +static void mail_display_attachment_expander_clicked_cb (EWebView *web_view, const gchar *element_class, const gchar *element_value, @@ -893,8 +908,45 @@ mail_display_attachment_expander_clicked_cb (EWebView *web_view, attachment = mail_display_ref_attachment_from_element (display, element_value); if (attachment) { - /* Flip the current 'visible' state */ - mail_display_change_one_attachment_visibility (display, attachment, FALSE, TRUE); + if (e_attachment_get_can_show (attachment)) { + /* Flip the current 'visible' state */ + mail_display_change_one_attachment_visibility (display, attachment, FALSE, TRUE); + } else { + GAppInfo *default_app; + gpointer parent; + + parent = gtk_widget_get_toplevel (GTK_WIDGET (web_view)); + parent = gtk_widget_is_toplevel (parent) ? parent : NULL; + + /* Either open in the default application... */ + default_app = e_attachment_ref_default_app (attachment); + if (default_app) { + e_attachment_open_async ( + attachment, default_app, (GAsyncReadyCallback) + e_attachment_open_handle_error, parent); + + g_object_unref (default_app); + } else { + /* ...or save it */ + GList *attachments; + EAttachmentStore *store; + GFile *destination; + + store = e_mail_display_get_attachment_store (display); + attachments = g_list_prepend (NULL, attachment); + + destination = e_attachment_store_run_save_dialog (store, attachments, parent); + if (destination) { + e_attachment_save_async ( + attachment, destination, (GAsyncReadyCallback) + call_attachment_save_handle_error, parent ? g_object_ref (parent) : NULL); + + g_object_unref (destination); + } + + g_list_free (attachments); + } + } } g_clear_object (&attachment); -- 2.11.4.GIT
" - "" @@ -268,8 +268,9 @@ emfe_attachment_format (EMailFormatterExtension *extension, "" "" "%s