talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

commit 75303bc85c77fe802d57e7762ab8ce736770631c
parent e0155435215b3af4ea67626f5471a81bedb2cfe6
Author: wwp <subscript@free.fr>
Date:   Tue, 15 Apr 2025 15:21:38 +0200

Add more per-folder settings to handle HTML content.

Diffstat:
Msrc/folder_item_prefs.c | 8++++++++
Msrc/folder_item_prefs.h | 12++++++++++++
Msrc/messageview.c | 4+++-
Msrc/prefs_folder_item.c | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Msrc/textview.c | 8+++++++-
5 files changed, 116 insertions(+), 4 deletions(-)

diff --git a/src/folder_item_prefs.c b/src/folder_item_prefs.c @@ -102,6 +102,10 @@ static PrefParam param[] = { NULL, NULL, NULL}, {"remove_old_bodies", "FALSE", &tmp_prefs.remove_old_bodies, P_BOOL, NULL, NULL, NULL}, + {"render_html", "0", &tmp_prefs.render_html, P_ENUM, + NULL, NULL, NULL}, + {"invoke_plugin_on_html", "0", &tmp_prefs.invoke_plugin_on_html, P_ENUM, + NULL, NULL, NULL}, {"promote_html_part", "0", &tmp_prefs.promote_html_part, P_ENUM, NULL, NULL, NULL}, {"skip_on_goto_unread_or_new", "FALSE", &tmp_prefs.skip_on_goto_unread_or_new, P_BOOL, @@ -231,6 +235,8 @@ static FolderItemPrefs *folder_item_prefs_clear(FolderItemPrefs *prefs) prefs->offlinesync = FALSE; prefs->offlinesync_days = 0; prefs->remove_old_bodies = FALSE; + prefs->render_html = HTML_RENDER_DEFAULT; + prefs->invoke_plugin_on_html = INVOKE_PLUGIN_ON_HTML_DEFAULT; prefs->promote_html_part = HTML_PROMOTE_DEFAULT; prefs->skip_on_goto_unread_or_new = FALSE; @@ -293,6 +299,8 @@ void folder_item_prefs_copy_prefs(FolderItem * src, FolderItem * dest) tmp_prefs.offlinesync = src->prefs->offlinesync; tmp_prefs.offlinesync_days = src->prefs->offlinesync_days; tmp_prefs.remove_old_bodies = src->prefs->remove_old_bodies; + tmp_prefs.render_html = src->prefs->render_html; + tmp_prefs.invoke_plugin_on_html = src->prefs->invoke_plugin_on_html; tmp_prefs.promote_html_part = src->prefs->promote_html_part; tmp_prefs.skip_on_goto_unread_or_new = src->prefs->skip_on_goto_unread_or_new; diff --git a/src/folder_item_prefs.h b/src/folder_item_prefs.h @@ -27,6 +27,16 @@ typedef struct _FolderItemPrefs FolderItemPrefs; #include "folder.h" typedef enum { + HTML_RENDER_DEFAULT=0, + HTML_RENDER_NEVER, + HTML_RENDER_ALWAYS +} HTMLRenderType; +typedef enum { + INVOKE_PLUGIN_ON_HTML_DEFAULT=0, + INVOKE_PLUGIN_ON_HTML_NEVER, + INVOKE_PLUGIN_ON_HTML_ALWAYS +} InvokePluginOnHTMLType; +typedef enum { HTML_PROMOTE_DEFAULT=0, HTML_PROMOTE_NEVER, HTML_PROMOTE_ALWAYS @@ -50,6 +60,8 @@ struct _FolderItemPrefs { int offlinesync; int offlinesync_days; int remove_old_bodies; + HTMLRenderType render_html; + InvokePluginOnHTMLType invoke_plugin_on_html; HTMLPromoteType promote_html_part; gboolean skip_on_goto_unread_or_new; diff --git a/src/messageview.c b/src/messageview.c @@ -1540,7 +1540,9 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo, if (!mimeview_show_part(messageview->mimeview, mimeinfo)) mimeview_select_mimepart_icon(messageview->mimeview, root); goto done; - } else if (prefs_common.invoke_plugin_on_html) { + } else if ((msginfo->folder->prefs->invoke_plugin_on_html == INVOKE_PLUGIN_ON_HTML_ALWAYS || + (msginfo->folder->prefs->invoke_plugin_on_html == INVOKE_PLUGIN_ON_HTML_DEFAULT && + prefs_common.invoke_plugin_on_html))) { mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo); goto done; } diff --git a/src/prefs_folder_item.c b/src/prefs_folder_item.c @@ -90,8 +90,10 @@ struct _FolderItemGeneralPage GtkWidget *entry_offlinesync; GtkWidget *label_end_offlinesync; GtkWidget *checkbtn_remove_old_offlinesync; + GtkWidget *render_html; + GtkWidget *invoke_plugin_on_html; GtkWidget *promote_html_part; - + /* apply to sub folders */ GtkWidget *simplify_subject_rec_checkbtn; GtkWidget *folder_chmod_rec_checkbtn; @@ -101,6 +103,8 @@ struct _FolderItemGeneralPage GtkWidget *newmailcheck_rec_checkbtn; GtkWidget *skip_on_goto_unread_or_new_rec_checkbtn; GtkWidget *offlinesync_rec_checkbtn; + GtkWidget *render_html_rec_checkbtn; + GtkWidget *invoke_plugin_on_html_rec_checkbtn; GtkWidget *promote_html_part_rec_checkbtn; GdkRGBA folder_color; @@ -263,7 +267,11 @@ static void prefs_folder_item_general_create_widget_func(PrefsPage * page_, GtkWidget *entry_offlinesync; GtkWidget *label_end_offlinesync; GtkWidget *checkbtn_remove_old_offlinesync; + GtkWidget *render_html; + GtkWidget *invoke_plugin_on_html; GtkWidget *promote_html_part; + GtkListStore *render_html_menu; + GtkListStore *invoke_plugin_on_html_menu; GtkListStore *promote_html_part_menu; GtkWidget *simplify_subject_rec_checkbtn; @@ -275,6 +283,8 @@ static void prefs_folder_item_general_create_widget_func(PrefsPage * page_, GtkWidget *newmailcheck_rec_checkbtn; GtkWidget *skip_on_goto_unread_or_new_rec_checkbtn; GtkWidget *offlinesync_rec_checkbtn; + GtkWidget *render_html_rec_checkbtn; + GtkWidget *invoke_plugin_on_html_rec_checkbtn; GtkWidget *promote_html_part_rec_checkbtn; gint wreq1, wreq2; @@ -515,6 +525,62 @@ static void prefs_folder_item_general_create_widget_func(PrefsPage * page_, rowcount++; + /* Render HTML messages as text? */ + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW_2); + gtk_box_set_spacing(GTK_BOX(hbox), 8); + gtk_grid_attach(GTK_GRID(table), hbox, 0, rowcount, 1, 1); + + label = gtk_label_new(_("Render HTML messages as text")); + gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); + + render_html = gtkut_sc_combobox_create (NULL, FALSE); + gtk_box_pack_start (GTK_BOX(hbox), render_html, FALSE, FALSE, 0); + + render_html_menu = GTK_LIST_STORE(gtk_combo_box_get_model( + GTK_COMBO_BOX(render_html))); + COMBOBOX_ADD (render_html_menu, _("Default"), HTML_RENDER_DEFAULT); + COMBOBOX_ADD (render_html_menu, _("No"), HTML_RENDER_NEVER); + COMBOBOX_ADD (render_html_menu, _("Yes"), HTML_RENDER_ALWAYS); + + combobox_select_by_data(GTK_COMBO_BOX(render_html), + item->prefs->render_html); + + CLAWS_SET_TIP(hbox, + _("\"Default\" will follow global preference (found in '/Configuration/Preferences/Message View/Text Options')")); + + render_html_rec_checkbtn = gtk_check_button_new(); + gtk_grid_attach(GTK_GRID(table), render_html_rec_checkbtn, 2, rowcount, 1, 1); + + rowcount++; + + /* Render HTML-only messages with plugin if possible? */ + hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW_2); + gtk_box_set_spacing(GTK_BOX(hbox), 8); + gtk_grid_attach(GTK_GRID(table), hbox, 0, rowcount, 1, 1); + + label = gtk_label_new(_("Render HTML-only messages with plugin if possible")); + gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0); + + invoke_plugin_on_html = gtkut_sc_combobox_create (NULL, FALSE); + gtk_box_pack_start (GTK_BOX(hbox), invoke_plugin_on_html, FALSE, FALSE, 0); + + invoke_plugin_on_html_menu = GTK_LIST_STORE(gtk_combo_box_get_model( + GTK_COMBO_BOX(invoke_plugin_on_html))); + COMBOBOX_ADD (invoke_plugin_on_html_menu, _("Default"), INVOKE_PLUGIN_ON_HTML_DEFAULT); + COMBOBOX_ADD (invoke_plugin_on_html_menu, _("No"), INVOKE_PLUGIN_ON_HTML_NEVER); + COMBOBOX_ADD (invoke_plugin_on_html_menu, _("Yes"), INVOKE_PLUGIN_ON_HTML_ALWAYS); + + combobox_select_by_data(GTK_COMBO_BOX(invoke_plugin_on_html), + item->prefs->invoke_plugin_on_html); + + CLAWS_SET_TIP(hbox, + _("\"Default\" will follow global preference (found in '/Configuration/Preferences/Message View/Text Options')")); + + invoke_plugin_on_html_rec_checkbtn = gtk_check_button_new(); + gtk_grid_attach(GTK_GRID(table), invoke_plugin_on_html_rec_checkbtn, 2, rowcount, 1, 1); + + rowcount++; + /* Select HTML part by default? */ hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VSPACING_NARROW_2); gtk_box_set_spacing(GTK_BOX(hbox), 8); @@ -673,6 +739,8 @@ static void prefs_folder_item_general_create_widget_func(PrefsPage * page_, page->entry_offlinesync = entry_offlinesync; page->label_end_offlinesync = label_end_offlinesync; page->checkbtn_remove_old_offlinesync = checkbtn_remove_old_offlinesync; + page->render_html = render_html; + page->invoke_plugin_on_html = invoke_plugin_on_html; page->promote_html_part = promote_html_part; page->simplify_subject_rec_checkbtn = simplify_subject_rec_checkbtn; @@ -684,6 +752,8 @@ static void prefs_folder_item_general_create_widget_func(PrefsPage * page_, page->newmailcheck_rec_checkbtn = newmailcheck_rec_checkbtn; page->skip_on_goto_unread_or_new_rec_checkbtn = skip_on_goto_unread_or_new_rec_checkbtn; page->offlinesync_rec_checkbtn = offlinesync_rec_checkbtn; + page->render_html_rec_checkbtn = render_html_rec_checkbtn; + page->invoke_plugin_on_html_rec_checkbtn = invoke_plugin_on_html_rec_checkbtn; page->promote_html_part_rec_checkbtn = promote_html_part_rec_checkbtn; page->page.widget = table; @@ -708,6 +778,8 @@ static void general_save_folder_prefs(FolderItem *folder, FolderItemGeneralPage gboolean all = FALSE, summary_update_needed = FALSE; SpecialFolderItemType type = F_NORMAL; FolderView *folderview = mainwindow_get_mainwindow()->folderview; + HTMLRenderType render_html = HTML_RENDER_DEFAULT; + InvokePluginOnHTMLType invoke_plugin_on_html = INVOKE_PLUGIN_ON_HTML_DEFAULT; HTMLPromoteType promote_html_part = HTML_PROMOTE_DEFAULT; if (folder->path == NULL) @@ -724,6 +796,16 @@ static void general_save_folder_prefs(FolderItem *folder, FolderItemGeneralPage summary_update_needed = TRUE; } + render_html = + combobox_get_active_data(GTK_COMBO_BOX(page->render_html)); + if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->render_html_rec_checkbtn))) + prefs->render_html = render_html; + + invoke_plugin_on_html = + combobox_get_active_data(GTK_COMBO_BOX(page->invoke_plugin_on_html)); + if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->invoke_plugin_on_html_rec_checkbtn))) + prefs->invoke_plugin_on_html = invoke_plugin_on_html; + promote_html_part = combobox_get_active_data(GTK_COMBO_BOX(page->promote_html_part)); if (all || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->promote_html_part_rec_checkbtn))) @@ -819,7 +901,9 @@ static gboolean general_save_recurse_func(GNode *node, gpointer data) gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->newmailcheck_rec_checkbtn)) || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->offlinesync_rec_checkbtn)) || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->skip_on_goto_unread_or_new_rec_checkbtn)) || - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->promote_html_part_rec_checkbtn)) + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->render_html_rec_checkbtn)) || + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->invoke_plugin_on_html_rec_checkbtn)) || + gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->promote_html_part_rec_checkbtn)) )) return TRUE; else diff --git a/src/textview.c b/src/textview.c @@ -1018,6 +1018,7 @@ static void textview_write_body(TextView *textview, MimeInfo *mimeinfo) GSList *cur; gboolean continue_write = TRUE; glong wrote = 0, i = 0; + FolderItem *folder_item = NULL; if (textview->messageview->forced_charset) charset = textview->messageview->forced_charset; @@ -1050,8 +1051,13 @@ static void textview_write_body(TextView *textview, MimeInfo *mimeinfo) account_sigsep_matchlist_create(); + if (textview->messageview->msginfo && textview->messageview->msginfo->folder) + folder_item = textview->messageview->msginfo->folder; + if (!g_ascii_strcasecmp(mimeinfo->subtype, "html") && - prefs_common.render_html) { + ((folder_item && folder_item->prefs && folder_item->prefs->render_html == HTML_RENDER_ALWAYS) + || ((folder_item && folder_item->prefs && folder_item->prefs->render_html == HTML_RENDER_DEFAULT) + && prefs_common.render_html))) { gchar *filename; filename = procmime_get_tmp_file_name(mimeinfo);