/*
- * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2013 Hiroyuki Yamamoto and the Claws Mail team
+ * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
+ * Copyright (C) 1999-2016 Hiroyuki Yamamoto and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
*/
#include "defs.h"
#include "statusbar.h"
#include "folder_item_prefs.h"
#include "avatars.h"
-#ifndef USE_NEW_ADDRBOOK
+#include "file-utils.h"
+
+#ifndef USE_ALT_ADDRBOOK
#include "addressbook.h"
#else
#include "addressadd.h"
gpointer data);
static PrefsAccount *select_account_from_list
- (GList *ac_list);
+ (GList *ac_list,
+ gboolean has_accounts);
static void addressbook_open_cb (GtkAction *action,
gpointer data);
static void add_address_cb (GtkAction *action,
static GList *msgview_list = NULL;
static GtkActionEntry msgview_entries[] =
{
- {"Menu", NULL, "Menu" },
+ {"Menu", NULL, "Menu", NULL, NULL, NULL },
/* menus */
- {"File", NULL, N_("_File") },
- {"Edit", NULL, N_("_Edit") },
- {"View", NULL, N_("_View") },
- {"Message", NULL, N_("_Message") },
- {"Tools", NULL, N_("_Tools") },
- {"Help", NULL, N_("_Help") },
- {"PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(messageview_nothing_cb) },
+ {"File", NULL, N_("_File"), NULL, NULL, NULL },
+ {"Edit", NULL, N_("_Edit"), NULL, NULL, NULL },
+ {"View", NULL, N_("_View"), NULL, NULL, NULL },
+ {"Message", NULL, N_("_Message"), NULL, NULL, NULL },
+ {"Tools", NULL, N_("_Tools"), NULL, NULL, NULL },
+ {"Help", NULL, N_("_Help"), NULL, NULL, NULL },
+ {"PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(messageview_nothing_cb) },
/* File menu */
- {"File/SaveAs", NULL, N_("_Save email as..."), "<control>S", NULL, G_CALLBACK(save_as_cb) },
- {"File/SavePartAs", NULL, N_("_Save part as..."), "Y", NULL, G_CALLBACK(save_part_as_cb) },
- {"File/PageSetup", NULL, N_("Page setup..."), NULL, NULL, G_CALLBACK(page_setup_cb) },
- {"File/Print", NULL, N_("_Print..."), "<control>P", NULL, G_CALLBACK(print_cb) },
- {"File/---", NULL, "---", NULL, NULL, NULL },
- {"File/Close", NULL, N_("_Close"), "<control>W", NULL, G_CALLBACK(close_cb) },
+ {"File/SaveAs", NULL, N_("_Save email as..."), "<control>S", NULL, G_CALLBACK(save_as_cb) },
+ {"File/SavePartAs", NULL, N_("_Save part as..."), "Y", NULL, G_CALLBACK(save_part_as_cb) },
+ {"File/PageSetup", NULL, N_("Page setup..."), NULL, NULL, G_CALLBACK(page_setup_cb) },
+ {"File/Print", NULL, N_("_Print..."), "<control>P", NULL, G_CALLBACK(print_cb) },
+ {"File/---", NULL, "---", NULL, NULL, NULL },
+ {"File/Close", NULL, N_("_Close"), "<control>W", NULL, G_CALLBACK(close_cb) },
/* Edit menu */
- {"Edit/Copy", NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(copy_cb) },
- {"Edit/SelectAll", NULL, N_("_Select all"), "<control>A", NULL, G_CALLBACK(allsel_cb) },
- {"Edit/---", NULL, "---", NULL, NULL, NULL },
- {"Edit/Find", NULL, N_("_Find"), "<control>F", NULL, G_CALLBACK(search_cb) },
+ {"Edit/Copy", NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(copy_cb) },
+ {"Edit/SelectAll", NULL, N_("_Select all"), "<control>A", NULL, G_CALLBACK(allsel_cb) },
+ {"Edit/---", NULL, "---", NULL, NULL, NULL },
+ {"Edit/Find", NULL, N_("_Find"), "<control>F", NULL, G_CALLBACK(search_cb) },
/* View menu */
- {"View/Goto", NULL, N_("_Go to") },
- {"View/Goto/Prev", NULL, N_("_Previous message"), "P", NULL, G_CALLBACK(prev_cb) },
- {"View/Goto/Next", NULL, N_("_Next message"), "N", NULL, G_CALLBACK(next_cb) },
- {"View/Goto/---", NULL, "---", NULL, NULL, NULL },
- {"View/Goto/PrevUnread", NULL, N_("P_revious unread message"), "<shift>P", NULL, G_CALLBACK(prev_unread_cb) },
- {"View/Goto/NextUnread", NULL, N_("N_ext unread message"), "<shift>N", NULL, G_CALLBACK(next_unread_cb) },
- /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
- {"View/Goto/PrevNew", NULL, N_("Previous ne_w message"), NULL, NULL, G_CALLBACK(prev_new_cb) },
- {"View/Goto/NextNew", NULL, N_("Ne_xt new message"), NULL, NULL, G_CALLBACK(next_new_cb) },
- /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
- {"View/Goto/PrevMarked", NULL, N_("Previous _marked message"), NULL, NULL, G_CALLBACK(prev_marked_cb) },
- {"View/Goto/NextMarked", NULL, N_("Next m_arked message"), NULL, NULL, G_CALLBACK(next_marked_cb) },
- /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
- {"View/Goto/PrevLabeled", NULL, N_("Previous _labeled message"), NULL, NULL, G_CALLBACK(prev_labeled_cb) },
- {"View/Goto/NextLabeled", NULL, N_("Next la_beled message"), NULL, NULL, G_CALLBACK(next_labeled_cb) },
- /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
- {"View/Goto/PrevHistory", NULL, N_("Previous opened message"), "<alt>Left", NULL, G_CALLBACK(prev_history_cb) },
- {"View/Goto/NextHistory", NULL, N_("Next opened message"), "<alt>Right", NULL, G_CALLBACK(next_history_cb) },
- /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
- {"View/Goto/ParentMessage", NULL, N_("Parent message"), "<control>Up", NULL, G_CALLBACK(parent_cb) },
- /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
- {"View/Goto/NextUnreadFolder", NULL, N_("Next unread _folder"), "<shift>G", NULL, G_CALLBACK(goto_unread_folder_cb) },
- {"View/Goto/OtherFolder", NULL, N_("_Other folder..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
- /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
- {"View/Goto/NextPart", NULL, N_("Next part"), "A", NULL, G_CALLBACK(goto_next_part_cb) },
- {"View/Goto/PrevPart", NULL, N_("Previous part"), "Z", NULL, G_CALLBACK(goto_prev_part_cb) },
- {"View/Scroll", NULL, N_("Message scroll") },
- {"View/Scroll/PrevLine", NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
- {"View/Scroll/NextLine", NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
- {"View/Scroll/PrevPage", NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
- {"View/Scroll/NextPage", NULL, N_("Next page"), NULL, NULL, G_CALLBACK(scroll_next_page_cb) },
- /* {"View/Scroll/---", NULL, "---", NULL, NULL, NULL }, */
-
- {"View/Encoding", NULL, N_("Character _encoding") }, /* set_charset_cb */
- {"View/Encoding/---", NULL, "---" },
+ {"View/Goto", NULL, N_("_Go to"), NULL, NULL, NULL },
+ {"View/Goto/Prev", NULL, N_("_Previous message"), "P", NULL, G_CALLBACK(prev_cb) },
+ {"View/Goto/Next", NULL, N_("_Next message"), "N", NULL, G_CALLBACK(next_cb) },
+ {"View/Goto/---", NULL, "---", NULL, NULL, NULL },
+ {"View/Goto/PrevUnread", NULL, N_("P_revious unread message"), "<shift>P", NULL, G_CALLBACK(prev_unread_cb) },
+ {"View/Goto/NextUnread", NULL, N_("N_ext unread message"), "<shift>N", NULL, G_CALLBACK(next_unread_cb) },
+ /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
+ {"View/Goto/PrevNew", NULL, N_("Previous ne_w message"), NULL, NULL, G_CALLBACK(prev_new_cb) },
+ {"View/Goto/NextNew", NULL, N_("Ne_xt new message"), NULL, NULL, G_CALLBACK(next_new_cb) },
+ /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
+ {"View/Goto/PrevMarked", NULL, N_("Previous _marked message"), NULL, NULL, G_CALLBACK(prev_marked_cb) },
+ {"View/Goto/NextMarked", NULL, N_("Next m_arked message"), NULL, NULL, G_CALLBACK(next_marked_cb) },
+ /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
+ {"View/Goto/PrevLabeled", NULL, N_("Previous _labeled message"), NULL, NULL, G_CALLBACK(prev_labeled_cb) },
+ {"View/Goto/NextLabeled", NULL, N_("Next la_beled message"), NULL, NULL, G_CALLBACK(next_labeled_cb) },
+ /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
+ {"View/Goto/PrevHistory", NULL, N_("Previous opened message"), "<alt>Left", NULL, G_CALLBACK(prev_history_cb) },
+ {"View/Goto/NextHistory", NULL, N_("Next opened message"), "<alt>Right", NULL, G_CALLBACK(next_history_cb) },
+ /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
+ {"View/Goto/ParentMessage", NULL, N_("Parent message"), "<control>Up", NULL, G_CALLBACK(parent_cb) },
+ /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
+ {"View/Goto/NextUnreadFolder", NULL, N_("Next unread _folder"), "<shift>G", NULL, G_CALLBACK(goto_unread_folder_cb) },
+ {"View/Goto/Folder", NULL, N_("F_older..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
+ /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
+ {"View/Goto/NextPart", NULL, N_("Next part"), "A", NULL, G_CALLBACK(goto_next_part_cb) },
+ {"View/Goto/PrevPart", NULL, N_("Previous part"), "Z", NULL, G_CALLBACK(goto_prev_part_cb) },
+ {"View/Scroll", NULL, N_("Message scroll"), NULL, NULL, NULL },
+ {"View/Scroll/PrevLine", NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
+ {"View/Scroll/NextLine", NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
+ {"View/Scroll/PrevPage", NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
+ {"View/Scroll/NextPage", NULL, N_("Next page"), NULL, NULL, G_CALLBACK(scroll_next_page_cb) },
+ /* {"View/Scroll/---", NULL, "---", NULL, NULL, NULL }, */
+
+ {"View/Encoding", NULL, N_("Character _encoding"), NULL, NULL, NULL }, /* set_charset_cb */
+ {"View/Encoding/---", NULL, "---", NULL, NULL, NULL },
#define ENC_ACTION(cs_char,c_char,string) \
{ "View/Encoding/" cs_char, NULL, N_(string), NULL, NULL, c_char }
- {"View/Encoding/Western", NULL, N_("Western European") },
- {"View/Encoding/Baltic", NULL, N_("Baltic") },
- {"View/Encoding/Hebrew", NULL, N_("Hebrew") },
- {"View/Encoding/Arabic", NULL, N_("Arabic") },
- {"View/Encoding/Cyrillic", NULL, N_("Cyrillic") },
- {"View/Encoding/Japanese", NULL, N_("Japanese") },
- {"View/Encoding/Chinese", NULL, N_("Chinese") },
- {"View/Encoding/Korean", NULL, N_("Korean") },
- {"View/Encoding/Thai", NULL, N_("Thai") },
+ {"View/Encoding/Western", NULL, N_("Western European"), NULL, NULL, NULL },
+ {"View/Encoding/Baltic", NULL, N_("Baltic"), NULL, NULL, NULL },
+ {"View/Encoding/Hebrew", NULL, N_("Hebrew"), NULL, NULL, NULL },
+ {"View/Encoding/Arabic", NULL, N_("Arabic"), NULL, NULL, NULL },
+ {"View/Encoding/Cyrillic", NULL, N_("Cyrillic"), NULL, NULL, NULL },
+ {"View/Encoding/Japanese", NULL, N_("Japanese"), NULL, NULL, NULL },
+ {"View/Encoding/Chinese", NULL, N_("Chinese"), NULL, NULL, NULL },
+ {"View/Encoding/Korean", NULL, N_("Korean"), NULL, NULL, NULL },
+ {"View/Encoding/Thai", NULL, N_("Thai"), NULL, NULL, NULL },
- {"View/Decode", NULL, N_("Decode") }, /* set_decode_cb */
- {"View/Decode/---", NULL, "---" },
+ {"View/Decode", NULL, N_("Decode"), NULL, NULL, NULL }, /* set_decode_cb */
+ {"View/Decode/---", NULL, "---", NULL, NULL, NULL },
#define DEC_ACTION(cs_type,c_type,string) \
{ "View/Decode/" cs_type, NULL, N_(string), NULL, NULL, c_type }
- {"View/---", NULL, "---", NULL, NULL, NULL },
- {"View/MessageSource", NULL, N_("Mess_age source"), "<control>U", NULL, G_CALLBACK(view_source_cb) },
- {"View/Part", NULL, N_("Message part") },
- {"View/Part/AsText", NULL, N_("View as text"), "T", NULL, G_CALLBACK(view_part_as_text_cb) },
- {"View/Part/Open", NULL, N_("Open"), "L", NULL, G_CALLBACK(open_part_cb) },
+ {"View/---", NULL, "---", NULL, NULL, NULL },
+ {"View/MessageSource", NULL, N_("Mess_age source"), "<control>U", NULL, G_CALLBACK(view_source_cb) },
+ {"View/Part", NULL, N_("Message part"), NULL, NULL, NULL },
+ {"View/Part/AsText", NULL, N_("View as text"), "T", NULL, G_CALLBACK(view_part_as_text_cb) },
+ {"View/Part/Open", NULL, N_("Open"), "L", NULL, G_CALLBACK(open_part_cb) },
#ifndef G_OS_WIN32
- {"View/Part/OpenWith", NULL, N_("Open with..."), "O", NULL, G_CALLBACK(open_part_with_cb) },
+ {"View/Part/OpenWith", NULL, N_("Open with..."), "O", NULL, G_CALLBACK(open_part_with_cb) },
#endif
- {"View/Quotes", NULL, N_("Quotes") },
+ {"View/Quotes", NULL, N_("Quotes"), NULL, NULL, NULL },
/* Message menu */
- {"Message/Compose", NULL, N_("Compose _new message"), "<control>M", NULL, G_CALLBACK(compose_cb) },
- {"Message/---", NULL, "---", NULL, NULL, NULL },
+ {"Message/Compose", NULL, N_("Compose _new message"), "<control>M", NULL, G_CALLBACK(compose_cb) },
+ {"Message/---", NULL, "---", NULL, NULL, NULL },
- {"Message/Reply", NULL, N_("_Reply"), "<control>R", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY */
- {"Message/ReplyTo", NULL, N_("Repl_y to") },
- {"Message/ReplyTo/All", NULL, N_("_All"), "<control><shift>R", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY_TO_ALL */
- {"Message/ReplyTo/Sender", NULL, N_("_Sender"), NULL, NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY_TO_SENDER */
- {"Message/ReplyTo/List", NULL, N_("Mailing _list"), "<control>L", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY_TO_LIST */
- /* {"Message/---", NULL, "---", NULL, NULL, NULL }, */
+ {"Message/Reply", NULL, N_("_Reply"), "<control>R", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY */
+ {"Message/ReplyTo", NULL, N_("Repl_y to"), NULL, NULL, NULL },
+ {"Message/ReplyTo/All", NULL, N_("_All"), "<control><shift>R", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY_TO_ALL */
+ {"Message/ReplyTo/Sender", NULL, N_("_Sender"), NULL, NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY_TO_SENDER */
+ {"Message/ReplyTo/List", NULL, N_("Mailing _list"), "<control>L", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REPLY_TO_LIST */
+ /* {"Message/---", NULL, "---", NULL, NULL, NULL }, */
- {"Message/Forward", NULL, N_("_Forward"), "<control><alt>F", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_FORWARD_INLINE */
- {"Message/ForwardAtt", NULL, N_("For_ward as attachment"), NULL, NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_FORWARD_AS_ATTACH */
- {"Message/Redirect", NULL, N_("Redirec_t"), NULL, NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REDIRECT */
- {"Message/CheckSignature", NULL, N_("Check signature"), "C", NULL, G_CALLBACK(check_signature_cb) },
+ {"Message/Forward", NULL, N_("_Forward"), "<control><alt>F", NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_FORWARD_INLINE */
+ {"Message/ForwardAtt", NULL, N_("For_ward as attachment"), NULL, NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_FORWARD_AS_ATTACH */
+ {"Message/Redirect", NULL, N_("Redirec_t"), NULL, NULL, G_CALLBACK(reply_cb) }, /* COMPOSE_REDIRECT */
+ {"Message/CheckSignature", NULL, N_("Check signature"), "C", NULL, G_CALLBACK(check_signature_cb) },
/* Tools menu */
- {"Tools/AddressBook", NULL, N_("_Address book"), "<control><shift>A", NULL, G_CALLBACK(addressbook_open_cb) },
- {"Tools/AddSenderToAB", NULL, N_("Add sender to address boo_k"), NULL, NULL, G_CALLBACK(add_address_cb) },
- {"Tools/---", NULL, "---", NULL, NULL, NULL },
-
- {"Tools/CreateFilterRule", NULL, N_("_Create filter rule") },
- {"Tools/CreateFilterRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_AUTO */
- {"Tools/CreateFilterRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_FROM */
- {"Tools/CreateFilterRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_TO */
- {"Tools/CreateFilterRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SUBJECT */
+ {"Tools/AddressBook", NULL, N_("_Address book"), "<control><shift>A", NULL, G_CALLBACK(addressbook_open_cb) },
+ {"Tools/AddSenderToAB", NULL, N_("Add sender to address boo_k"), NULL, NULL, G_CALLBACK(add_address_cb) },
+ {"Tools/---", NULL, "---", NULL, NULL, NULL },
- {"Tools/CreateProcessingRule", NULL, N_("Create processing rule") },
- {"Tools/CreateProcessingRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_processing_cb) },
- {"Tools/CreateProcessingRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_processing_cb) },
- {"Tools/CreateProcessingRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_processing_cb) },
- {"Tools/CreateProcessingRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_processing_cb) },
+ {"Tools/CreateFilterRule", NULL, N_("_Create filter rule"), NULL, NULL, NULL },
+ {"Tools/CreateFilterRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_AUTO */
+ {"Tools/CreateFilterRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_FROM */
+ {"Tools/CreateFilterRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_TO */
+ {"Tools/CreateFilterRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SUBJECT */
- /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
+ {"Tools/CreateProcessingRule", NULL, N_("Create processing rule"), NULL, NULL, NULL },
+ {"Tools/CreateProcessingRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_processing_cb) },
+ {"Tools/CreateProcessingRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_processing_cb) },
+ {"Tools/CreateProcessingRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_processing_cb) },
+ {"Tools/CreateProcessingRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_processing_cb) },
+ /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
- {"Tools/ListUrls", NULL, N_("List _URLs..."), "<control><shift>U", NULL, G_CALLBACK(open_urls_cb) },
+ {"Tools/ListUrls", NULL, N_("List _URLs..."), "<control><shift>U", NULL, G_CALLBACK(open_urls_cb) },
- /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
- {"Tools/Actions", NULL, N_("Actio_ns") },
- {"Tools/Actions/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(messageview_nothing_cb) },
+ /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
+ {"Tools/Actions", NULL, N_("Actio_ns"), NULL, NULL, NULL },
+ {"Tools/Actions/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(messageview_nothing_cb) },
/* Help menu */
- {"Help/About", NULL, N_("_About"), NULL, NULL, G_CALLBACK(about_cb) },
+ {"Help/About", NULL, N_("_About"), NULL, NULL, G_CALLBACK(about_cb) },
};
static GtkToggleActionEntry msgview_toggle_entries[] =
{
- {"View/AllHeaders", NULL, N_("Show all _headers"), "<control>H", NULL, G_CALLBACK(show_all_header_cb) }, /* toggle */
- {"View/Quotes/CollapseAll", NULL, N_("_Collapse all"), "<control><shift>Q", NULL, G_CALLBACK(msg_hide_quotes_cb) }, /* 1 toggle */
- {"View/Quotes/Collapse2", NULL, N_("Collapse from level _2"), NULL, NULL, G_CALLBACK(msg_hide_quotes_cb) }, /* 2 toggle */
- {"View/Quotes/Collapse3", NULL, N_("Collapse from level _3"), NULL, NULL, G_CALLBACK(msg_hide_quotes_cb) }, /* 3 toggle */
+ {"View/AllHeaders", NULL, N_("Show all _headers"), "<control>H", NULL, G_CALLBACK(show_all_header_cb), FALSE }, /* toggle */
+ {"View/Quotes/CollapseAll", NULL, N_("_Collapse all"), "<control><shift>Q", NULL, G_CALLBACK(msg_hide_quotes_cb), FALSE }, /* 1 toggle */
+ {"View/Quotes/Collapse2", NULL, N_("Collapse from level _2"), NULL, NULL, G_CALLBACK(msg_hide_quotes_cb), FALSE }, /* 2 toggle */
+ {"View/Quotes/Collapse3", NULL, N_("Collapse from level _3"), NULL, NULL, G_CALLBACK(msg_hide_quotes_cb), FALSE }, /* 3 toggle */
};
static GtkRadioActionEntry msgview_radio_enc_entries[] =
ENC_ACTION(CS_ISO_8859_9, C_ISO_8859_9, N_("Turkish (ISO-8859-_9)")), /* RADIO set_charset_cb */
ENC_ACTION("Cyrillic/"CS_ISO_8859_5, C_ISO_8859_5, "ISO-8859-_5"), /* RADIO set_charset_cb */
ENC_ACTION("Cyrillic/"CS_KOI8_R, C_KOI8_R, "KOI8-_R"), /* RADIO set_charset_cb */
+ ENC_ACTION("Cyrillic/"CS_MACCYR, C_MACCYR, "MAC_CYR"), /* RADIO set_charset_cb */
ENC_ACTION("Cyrillic/"CS_KOI8_U, C_KOI8_U, "KOI8-_U"), /* RADIO set_charset_cb */
ENC_ACTION("Cyrillic/"CS_WINDOWS_1251, C_WINDOWS_1251, "Windows-1251"), /* RADIO set_charset_cb */
ENC_ACTION("Japanese/"CS_ISO_2022_JP, C_ISO_2022_JP, "ISO-2022-_JP"), /* RADIO set_charset_cb */
return messageview;
}
-GList *messageview_get_msgview_list(void)
+const GList *messageview_get_msgview_list(void)
{
return msgview_list;
}
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "ParentMessage", "View/Goto/ParentMessage", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "Separator7", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "NextUnreadFolder", "View/Goto/NextUnreadFolder", GTK_UI_MANAGER_MENUITEM)
- MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "OtherFolder", "View/Goto/OtherFolder", GTK_UI_MANAGER_MENUITEM)
+ MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "Folder", "View/Goto/Folder", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "Separator8", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "NextPart", "View/Goto/NextPart", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Goto", "PrevPart", "View/Goto/PrevPart", GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Encoding", "Cyrillic", "View/Encoding/Cyrillic", GTK_UI_MANAGER_MENU)
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_ISO_8859_5, "View/Encoding/Cyrillic/"CS_ISO_8859_5, GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_R, "View/Encoding/Cyrillic/"CS_KOI8_R, GTK_UI_MANAGER_MENUITEM)
+ MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_MACCYR, "View/Encoding/Cyrillic/"CS_MACCYR, GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_U, "View/Encoding/Cyrillic/"CS_KOI8_U, GTK_UI_MANAGER_MENUITEM)
MENUITEM_ADDUI_MANAGER(msgview->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_WINDOWS_1251, "View/Encoding/Cyrillic/"CS_WINDOWS_1251, GTK_UI_MANAGER_MENUITEM)
noticeview_hide(messageview->noticeview);
}
-static void notification_convert_header(gchar *dest, gint len,
+static void notification_convert_header(gchar **dest,
const gchar *src_,
gint header_len)
{
char *src;
cm_return_if_fail(src_ != NULL);
- cm_return_if_fail(dest != NULL);
- if (len < 1) return;
+ if (header_len < 1) {
+ *dest = g_strdup("");
+ return;
+ }
- Xstrndup_a(src, src_, len, return);
+ Xstrndup_a(src, src_, strlen(src_), return);
remove_return(src);
if (is_ascii_str(src)) {
- strncpy2(dest, src, len);
- dest[len - 1] = '\0';
+ *dest = g_strdup(src);
return;
- } else
- conv_encode_header(dest, len, src, header_len, FALSE);
+ } else {
+ *dest = g_malloc(BUFFSIZE);
+ conv_encode_header(*dest, BUFFSIZE, src, header_len, FALSE);
+ }
}
static gint disposition_notification_send(MsgInfo *msginfo)
{
- gchar buf[BUFFSIZE];
+ gchar *buf = NULL;
gchar tmp[MAXPATHLEN + 1];
FILE *fp;
GList *ac_list;
gchar *foo = NULL;
gboolean queued_removed = FALSE;
gchar *boundary = NULL;
+ gchar buf_date[RFC822_DATE_BUFFSIZE];
gchar *date = NULL;
gchar *orig_to = NULL;
gchar *enc_sub = NULL;
else
to = msginfo->extradata->returnreceiptto;
- ok = procheader_get_header_from_msginfo(msginfo, buf, sizeof(buf),
- "Return-Path:");
+ ok = procheader_get_header_from_msginfo(msginfo, &buf, "Return-Path:");
if (ok == 0) {
gchar *to_addr = g_strdup(to);
extract_address(to_addr);
ok = strcasecmp(to_addr, buf);
g_free(to_addr);
} else {
- strncpy(buf, _("<No Return-Path found>"),
- sizeof(buf));
+ buf = g_strdup(_("<No Return-Path found>"));
}
if (ok != 0) {
"to be sent does not correspond to the return path:\n"
"Notification address: %s\n"
"Return path: %s\n"
- "It is advised to not to send the return receipt."),
+ "It is advised to not send the return receipt."),
to, buf);
val = alertpanel_full(_("Warning"), message,
- _("_Don't Send"), _("_Send"), NULL, FALSE,
- NULL, ALERT_WARNING, G_ALERTDEFAULT);
+ _("_Don't Send"), _("_Send"), NULL, ALERTFOCUS_FIRST, FALSE,
+ NULL, ALERT_WARNING);
g_free(message);
- if (val != G_ALERTALTERNATE)
+ if (val != G_ALERTALTERNATE) {
+ g_free(buf);
return -1;
+ }
}
+ g_free(buf);
+ buf = NULL;
ac_list = account_find_all_from_address(NULL, msginfo->to);
ac_list = account_find_all_from_address(ac_list, msginfo->cc);
if (ac_list == NULL) {
- AlertValue val =
- alertpanel_full(_("Warning"),
- _("This message is asking for a return receipt notification\n"
- "but according to its 'To:' and 'CC:' headers it was not\n"
- "officially addressed to you.\n"
- "It is advised to not to send the return receipt."),
- _("_Don't Send"), _("_Send"), NULL, FALSE,
- NULL, ALERT_WARNING, G_ALERTDEFAULT);
- if (val != G_ALERTALTERNATE)
+ ac_list = account_find_all();
+ if ((account = select_account_from_list(ac_list, FALSE)) == NULL)
return -1;
- }
-
- if (g_list_length(ac_list) > 1) {
- if ((account = select_account_from_list(ac_list)) == NULL)
+ } else if (g_list_length(ac_list) > 1) {
+ if ((account = select_account_from_list(ac_list, TRUE)) == NULL)
return -1;
- }
- else if (ac_list != NULL)
+ } else if (ac_list != NULL)
account = (PrefsAccount *) ac_list->data;
g_list_free(ac_list);
g_snprintf(tmp, sizeof(tmp), "%s%ctmpmsg%p",
get_rc_dir(), G_DIR_SEPARATOR, msginfo);
- if ((fp = g_fopen(tmp, "wb")) == NULL) {
- FILE_OP_ERROR(tmp, "fopen");
+ if ((fp = claws_fopen(tmp, "wb")) == NULL) {
+ FILE_OP_ERROR(tmp, "claws_fopen");
return -1;
}
/* chmod for security */
if (change_file_mode_rw(fp, tmp) < 0) {
FILE_OP_ERROR(tmp, "chmod");
- g_warning("can't change file mode\n");
+ g_warning("can't change file mode");
}
addr = g_strdup(to);
goto FILE_ERROR;
/* Date */
- get_rfc822_date(buf, sizeof(buf));
- if (fprintf(fp, "Date: %s\n", buf) < 0)
+ get_rfc822_date(buf_date, sizeof(buf_date));
+ if (fprintf(fp, "Date: %s\n", buf_date) < 0)
goto FILE_ERROR;
/* From */
if (account->name && *account->name) {
- notification_convert_header
- (buf, sizeof(buf), account->name,
- strlen("From: "));
- if (fprintf(fp, "From: %s <%s>\n", buf, account->address) < 0)
+ notification_convert_header(&buf, account->name, strlen("From: "));
+ if (buf == NULL)
goto FILE_ERROR;
- } else
- if (fprintf(fp, "From: %s\n", account->address) < 0)
+ if (fprintf(fp, "From: %s <%s>\n", buf, account->address) < 0) {
+ g_free(buf);
goto FILE_ERROR;
+ }
+ g_free(buf);
+ buf = NULL;
+ } else
+ goto FILE_ERROR;
if (fprintf(fp, "To: %s\n", to) < 0)
goto FILE_ERROR;
/* Subject */
- notification_convert_header(buf, sizeof(buf), msginfo->subject,
- strlen("Subject: "));
- if (fprintf(fp, "Subject: Disposition notification: %s\n", buf) < 0)
+ notification_convert_header(&buf, msginfo->subject, strlen("Subject: "));
+ if (buf == NULL)
+ goto FILE_ERROR;
+ if (fprintf(fp, "Subject: Disposition notification: %s\n", buf) < 0) {
+ g_free(buf);
goto FILE_ERROR;
+ }
+ g_free(buf);
+ buf = NULL;
/* Message ID */
- if (account->set_domain && account->domain) {
- g_snprintf(buf, sizeof(buf), "%s", account->domain);
- } else if (!strncmp(get_domain_name(), "localhost", strlen("localhost"))) {
- g_snprintf(buf, sizeof(buf), "%s",
- strchr(account->address, '@') ?
- strchr(account->address, '@')+1 :
- account->address);
- } else {
- g_snprintf(buf, sizeof(buf), "%s", "");
- }
-
if (account->gen_msgid) {
- gchar *addr = NULL;
- if (account->msgid_with_addr) {
- addr = account->address;
- }
- generate_msgid(buf, sizeof(buf), addr);
-
- if (fprintf(fp, "Message-ID: <%s>\n", buf) < 0)
+ gchar *addr = prefs_account_generate_msgid(account);
+ if (fprintf(fp, "Message-ID: <%s>\n", addr) < 0) {
+ g_free(addr);
goto FILE_ERROR;
+ }
+ g_free(addr);
}
boundary = generate_mime_boundary("DN");
- get_rfc822_date(buf, sizeof(buf));
- date = g_strdup(buf);
+ date = g_strdup(buf_date);
if (msginfo->to) {
orig_to = g_strdup(msginfo->to);
extract_address(orig_to);
if (ok < 0)
goto FILE_ERROR;
- if (fclose(fp) == EOF) {
- FILE_OP_ERROR(tmp, "fclose");
+ if (claws_safe_fclose(fp) == EOF) {
+ FILE_OP_ERROR(tmp, "claws_fclose");
claws_unlink(tmp);
return -1;
}
queue = account_get_special_folder(account, F_QUEUE);
if (!queue) queue = folder_get_default_queue();
if (!queue) {
- g_warning("can't find queue folder\n");
+ g_warning("can't find queue folder");
claws_unlink(tmp);
return -1;
}
folder_item_scan(queue);
if ((num = folder_item_add_msg(queue, tmp, NULL, TRUE)) < 0) {
- g_warning("can't queue the message\n");
+ g_warning("can't queue the message");
claws_unlink(tmp);
return -1;
}
return ok;
FILE_ERROR:
- fclose(fp);
+ claws_fclose(fp);
claws_unlink(tmp);
return -1;
}
if (end->prev) {
end->prev->next = NULL;
end->prev = NULL;
- list_free_strings(end);
- g_list_free(end);
+ list_free_strings_full(end);
} else {
- list_free_strings(messageview->trail);
- g_list_free(messageview->trail);
+ list_free_strings_full(messageview->trail);
messageview->trail = NULL;
}
}
messageview->trail = g_list_append(messageview->trail, id);
- messageview->trail_pos = g_list_length(messageview->trail) - 1;
+ messageview->trail_pos = (gint)g_list_length(messageview->trail) - 1;
/* Cut the beginning if needed */
while (messageview->trail_pos > prefs_common.nav_history_length) {
}
gboolean messageview_nav_has_prev(MessageView *messageview) {
- return messageview->trail != NULL && messageview->trail_pos > 0;
+ return messageview != NULL && messageview->trail != NULL
+ && messageview->trail_pos > 0;
}
gboolean messageview_nav_has_next(MessageView *messageview) {
- if (!messageview->trail)
+ if (!messageview || !messageview->trail)
return FALSE;
return sc_g_list_bigger(messageview->trail, messageview->trail_pos + 1);
return info;
}
+static gboolean messageview_try_select_mimeinfo(MessageView *messageview, MsgInfo *msginfo, MimeInfo *mimeinfo)
+{
+ if (mimeinfo->type == MIMETYPE_TEXT) {
+ if (!strcasecmp(mimeinfo->subtype, "calendar")
+ && mimeview_has_viewer_for_content_type(messageview->mimeview, "text/calendar")) {
+ mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo);
+ return TRUE;
+ } else if (!strcasecmp(mimeinfo->subtype, "html")
+ && mimeinfo->disposition != DISPOSITIONTYPE_ATTACHMENT
+ && ((msginfo->folder && msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_ALWAYS)
+ || ((msginfo->folder && msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_DEFAULT)
+ && prefs_common.promote_html_part))) {
+ mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static void messageview_find_part_depth_first(MimeInfoSearch *context, MimeMediaType type, const gchar *subtype)
+{
+ MimeInfo * mimeinfo = context->current;
+
+ if (!mimeinfo)
+ return;
+
+ debug_print("found part %d/%s\n", mimeinfo->type, mimeinfo->subtype);
+
+ if (mimeinfo->type == type
+ && !strcasecmp(mimeinfo->subtype, subtype)) {
+ context->found = mimeinfo;
+ } else if (mimeinfo->type == MIMETYPE_MULTIPART) {
+ if (!strcasecmp(mimeinfo->subtype, "alternative")
+ || !strcasecmp(mimeinfo->subtype, "related")) {
+ context->found = procmime_mimeinfo_next(mimeinfo);
+ while (context->found && context->found != context->parent) {
+ if (context->found->type == type
+ && !strcasecmp(context->found->subtype, subtype))
+ break;
+ context->found = procmime_mimeinfo_next(context->found);
+ }
+ if (context->found == context->parent)
+ context->found = NULL;
+ }
+ if (!context->found
+ && (!strcasecmp(mimeinfo->subtype, "related")
+ || !strcasecmp(mimeinfo->subtype, "mixed"))) {
+ context->parent = mimeinfo;
+ context->current = procmime_mimeinfo_next(mimeinfo);
+ messageview_find_part_depth_first(context, type, subtype);
+ }
+ }
+}
+
gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
gboolean all_headers)
{
gchar *text = NULL;
gchar *file;
- MimeInfo *mimeinfo, *encinfo, *brokeninfo, *root;
+ MimeInfo *mimeinfo, *encinfo, *root;
gchar *subject = NULL;
cm_return_val_if_fail(msginfo != NULL, -1);
messageview->updating = TRUE;
if (msginfo->size > 1024*1024)
- statuswindow_print_all(_("Fetching message (%s)..."),
+ statusbar_print_all(_("Fetching message (%s)..."),
to_human_readable(msginfo->size));
file = procmsg_get_message_file_path(msginfo);
if (msginfo->size > 1024*1024)
- statuswindow_pop_all();
+ statusbar_pop_all();
if (!file) {
- g_warning("can't get message file path.\n");
+ g_warning("can't get message file path.");
textview_show_error(messageview->mimeview->textview);
return -1;
}
}
if (messageview->msginfo != msginfo) {
- procmsg_msginfo_free(messageview->msginfo);
+ procmsg_msginfo_free(&(messageview->msginfo));
messageview->msginfo = NULL;
messageview_set_menu_sensitive(messageview);
messageview->msginfo =
g_free(subject);
}
- if (msginfo && msginfo->folder) {
+ if (msginfo->folder) {
msginfo->folder->last_seen = msginfo->msgnum;
}
return_receipt_show(messageview->noticeview,
messageview->msginfo);
- if ((brokeninfo = find_broken_part(mimeinfo)) != NULL) {
+ if (find_broken_part(mimeinfo) != NULL) {
noticeview_set_icon(messageview->noticeview,
STOCK_PIXMAP_NOTICE_WARN);
if (!noticeview_is_visible(messageview->noticeview)) {
root = mimeinfo;
mimeinfo = procmime_mimeinfo_next(mimeinfo);
- if (!all_headers && mimeinfo
- && (mimeinfo->type != MIMETYPE_TEXT ||
- strcasecmp(mimeinfo->subtype, "plain"))
- && (mimeinfo->type != MIMETYPE_MULTIPART ||
- strcasecmp(mimeinfo->subtype, "signed"))) {
- if (strcasecmp(mimeinfo->subtype, "html")) {
- MimeInfo *saved_mimeinfo = mimeinfo;
- MimeInfo *alt_parent = mimeinfo;
-
- /* if multipart/{related,mixed} part, look inside for a multipart/alternative child */
- if (mimeinfo->type == MIMETYPE_MULTIPART &&
- (!strcasecmp(mimeinfo->subtype, "related") ||
- !strcasecmp(mimeinfo->subtype, "mixed"))) {
- for (; mimeinfo; mimeinfo = procmime_mimeinfo_next(mimeinfo)) {
- if (mimeinfo->node->parent != saved_mimeinfo->node) {
- /* only consider children of the
- * multipart/{related,mixed} part */
- continue;
- }
- if (mimeinfo->type == MIMETYPE_MULTIPART &&
- !strcasecmp(mimeinfo->subtype, "alternative")) {
- /* we got an alternative part */
- alt_parent = mimeinfo;
- break;
- }
- if (mimeinfo->type == MIMETYPE_TEXT &&
- !strcasecmp(mimeinfo->subtype, "calendar") &&
- mimeview_has_viewer_for_content_type(messageview->mimeview,
- "text/calendar")) {
- mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo);
- goto done;
- } else if (mimeinfo->type == MIMETYPE_TEXT &&
- !strcasecmp(mimeinfo->subtype, "html") &&
- mimeinfo->disposition != DISPOSITIONTYPE_ATTACHMENT &&
- (msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_ALWAYS ||
- (msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_DEFAULT &&
- prefs_common.promote_html_part))) {
- mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo);
+ if (!all_headers && mimeinfo
+ && (mimeinfo->type != MIMETYPE_TEXT
+ || strcasecmp(mimeinfo->subtype, "plain"))
+ && (mimeinfo->type != MIMETYPE_MULTIPART
+ || strcasecmp(mimeinfo->subtype, "signed"))) {
+ if (strcasecmp(mimeinfo->subtype, "html")) {
+ MimeInfoSearch context = {
+ .parent = root,
+ .current = mimeinfo,
+ .found = NULL
+ };
+ if (mimeview_has_viewer_for_content_type(messageview->mimeview, "text/calendar")) {
+ MimeInfoSearch cal_context = context;
+ messageview_find_part_depth_first(&cal_context, MIMETYPE_TEXT, "calendar");
+ if (cal_context.found) { /* calendar found */
+ mimeinfo = cal_context.found;
+ if (messageview_try_select_mimeinfo(messageview, msginfo, mimeinfo))
goto done;
- }
}
}
-
- /* if we now have a multipart/alternative part (possibly inside a
- * multipart/{related,mixed} part, look for an HTML part inside */
- if (mimeinfo && mimeinfo->type == MIMETYPE_MULTIPART &&
- !strcasecmp(mimeinfo->subtype, "alternative")) {
- for (; mimeinfo; mimeinfo = procmime_mimeinfo_next(mimeinfo)) {
- if (mimeinfo->node->parent != alt_parent->node) {
- /* only consider children of the
- * multipart/alternative part, so as
- * not to show html attachments */
- continue;
- }
-
- if (mimeinfo->type == MIMETYPE_TEXT &&
- !strcasecmp(mimeinfo->subtype, "calendar") &&
- mimeview_has_viewer_for_content_type(messageview->mimeview,
- "text/calendar")) {
- mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo);
- goto done;
- } else if (mimeinfo->type == MIMETYPE_TEXT &&
- !strcasecmp(mimeinfo->subtype, "html") &&
- mimeinfo->disposition != DISPOSITIONTYPE_ATTACHMENT &&
- (msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_ALWAYS ||
- (msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_DEFAULT &&
- prefs_common.promote_html_part))) {
- mimeview_select_mimepart_icon(messageview->mimeview, mimeinfo);
- goto done;
- }
- }
- }
-
- /* if we didn't find anything, go back to start */
- if (!mimeinfo)
- mimeinfo = saved_mimeinfo;
+ messageview_find_part_depth_first(&context, MIMETYPE_TEXT, "html");
+ if (context.found &&
+ ((msginfo->folder && msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_ALWAYS) ||
+ ((msginfo->folder && msginfo->folder->prefs->promote_html_part == HTML_PROMOTE_DEFAULT) &&
+ prefs_common.promote_html_part))) { /* html found */
+ mimeinfo = context.found;
+ if (messageview_try_select_mimeinfo(messageview, msginfo, mimeinfo))
+ goto done;
+ } else
+ mimeinfo = root; /* nothing found */
if (!mimeview_show_part(messageview->mimeview, mimeinfo))
mimeview_select_mimepart_icon(messageview->mimeview, root);
{
if (!messageview)
return;
- procmsg_msginfo_free(messageview->msginfo);
+ procmsg_msginfo_free(&(messageview->msginfo));
messageview->msginfo = NULL;
messageview->filtered = FALSE;
mimeview_destroy(messageview->mimeview);
noticeview_destroy(messageview->noticeview);
- procmsg_msginfo_free(messageview->msginfo);
+ procmsg_msginfo_free(&(messageview->msginfo));
toolbar_clear_list(TOOLBAR_MSGVIEW);
if (messageview->toolbar) {
toolbar_destroy(messageview->toolbar);
g_free(messageview->toolbar);
}
- list_free_strings(messageview->trail);
- g_list_free(messageview->trail);
+ message_search_close(messageview);
+
+ list_free_strings_full(messageview->trail);
msgview_list = g_list_remove(msgview_list, messageview);
if (messageview->window)
return messageview->visible;
}
-static void messageview_save_as(MessageView *messageview)
-{
- gchar *filename = NULL;
- MsgInfo *msginfo;
- gchar *src, *dest, *tmp;
-
- if (!messageview->msginfo) return;
- msginfo = messageview->msginfo;
-
- if (msginfo->subject) {
- Xstrdup_a(filename, msginfo->subject, return);
- subst_for_filename(filename);
- }
- if (filename && !g_utf8_validate(filename, -1, NULL)) {
- gchar *oldstr = filename;
- filename = conv_codeset_strdup(filename,
- conv_get_locale_charset_str(),
- CS_UTF_8);
- if (!filename) {
- g_warning("messageview_save_as(): failed to convert character set.");
- filename = g_strdup(oldstr);
- }
- dest = filesel_select_file_save(_("Save as"), filename);
- g_free(filename);
- } else
- dest = filesel_select_file_save(_("Save as"), filename);
- if (!dest) return;
- if (is_file_exist(dest)) {
- AlertValue aval;
-
- aval = alertpanel(_("Overwrite"),
- _("Overwrite existing file?"),
- GTK_STOCK_CANCEL, GTK_STOCK_OK, NULL);
- if (G_ALERTALTERNATE != aval) return;
- }
-
- src = procmsg_get_message_file(msginfo);
- if (copy_file(src, dest, TRUE) < 0) {
- tmp = g_path_get_basename(dest);
- alertpanel_error(_("Couldn't save the file '%s'."), tmp);
- g_free(tmp);
- }
- g_free(dest);
- g_free(src);
-}
-
static gint messageview_delete_cb(GtkWidget *widget, GdkEventAny *event,
MessageView *messageview)
{
if (from_me) {
noticeview_set_icon(noticeview, STOCK_PIXMAP_NOTICE_WARN);
if (MSG_IS_RETRCPT_GOT(msginfo->flags)) {
- noticeview_set_text(noticeview, _("You got a return receipt for this message : "
+ noticeview_set_text(noticeview, _("You got a return receipt for this message: "
"it has been displayed by the recipient."));
} else {
noticeview_set_text(noticeview, _("You asked for a return receipt in this message."));
file = procmsg_get_message_file_path(msginfo);
if (!file) {
- g_warning("can't get message file path.\n");
+ g_warning("can't get message file path.");
return;
}
noticeview_hide(noticeview);
}
- procmsg_msginfo_free(tmpmsginfo);
+ procmsg_msginfo_free(&tmpmsginfo);
g_free(file);
}
*(gint*)data = combobox_get_active_data(GTK_COMBO_BOX(w));
}
-static PrefsAccount *select_account_from_list(GList *ac_list)
+static PrefsAccount *select_account_from_list(GList *ac_list, gboolean has_accounts)
{
GtkWidget *optmenu;
gint account_id;
+ AlertValue val;
cm_return_val_if_fail(ac_list != NULL, NULL);
cm_return_val_if_fail(ac_list->data != NULL, NULL);
-
+
optmenu = gtkut_account_menu_new(ac_list,
G_CALLBACK(select_account_cb),
&account_id);
if (!optmenu)
return NULL;
account_id = ((PrefsAccount *) ac_list->data)->account_id;
- if (alertpanel_with_widget(
+ if (!has_accounts) {
+ gchar *tr;
+ gchar *text;
+ tr = g_strdup(C_("'%s' stands for 'To' then 'Cc'",
+ "This message is asking for a return receipt notification\n"
+ "but according to its '%s' and '%s' headers it was not\n"
+ "officially addressed to you.\n"
+ "It is advised to not send the return receipt."));
+ text = g_strdup_printf(tr,
+ prefs_common_translated_header_name("To"),
+ prefs_common_translated_header_name("Cc"));
+ val = alertpanel_with_widget(
+ _("Return Receipt Notification"),
+ text,
+ _("_Cancel"), _("_Send Notification"), NULL,
+ ALERTFOCUS_FIRST, FALSE, optmenu);
+ g_free(tr);
+ g_free(text);
+ } else
+ val = alertpanel_with_widget(
_("Return Receipt Notification"),
_("More than one of your accounts uses the "
- "address that this message was sent to.\n"
- "Please choose which account you want to "
- "use for sending the receipt notification:"),
- _("_Cancel"), _("_Send Notification"), NULL,
- FALSE, G_ALERTDEFAULT, optmenu) != G_ALERTALTERNATE)
+ "address that this message was sent to.\n"
+ "Please choose which account you want to "
+ "use for sending the receipt notification:"),
+ _("_Cancel"), _("_Send Notification"), NULL,
+ ALERTFOCUS_FIRST, FALSE, optmenu);
+
+ if (val != G_ALERTALTERNATE)
return NULL;
- return account_find_from_id(account_id);
+ else
+ return account_find_from_id(account_id);
}
/*
GtkTextView *edit = NULL;
GtkTextBuffer *textbuf;
gint body_pos = 0;
+ GtkTextIter start_iter, end_iter;
+ GtkTextMark *body_start, *body_end;
cm_return_val_if_fail(msgview != NULL, NULL);
textbuf = gtk_text_view_get_buffer(edit);
- if (gtk_text_buffer_get_selection_bounds(textbuf, NULL, NULL))
+ if (gtk_text_buffer_get_selection_bounds(textbuf, NULL, NULL)) {
return gtkut_text_view_get_selection(edit);
- else if (msgview->filtered) {
- GtkTextIter start_iter, end_iter;
- gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter, body_pos);
- gtk_text_buffer_get_end_iter(textbuf, &end_iter);
- gtk_text_buffer_get_text(textbuf, &start_iter, &end_iter, FALSE);
- } else
- text = NULL;
+ } else {
+ if (msgview->filtered) {
+ gtk_text_buffer_get_iter_at_offset(textbuf, &start_iter, body_pos);
+ gtk_text_buffer_get_end_iter(textbuf, &end_iter);
+ } else {
+ body_start = gtk_text_buffer_get_mark(textbuf, "body_start");
+
+ /* If there is no body_start mark, an attachment is likely
+ * selected, and we're looking at instructions on what to do
+ * with it. No point in quoting that, so we'll just return NULL,
+ * so that original message body is quoted instead down the line.
+ */
+ if (body_start == NULL) {
+ return NULL;
+ }
+
+ gtk_text_buffer_get_iter_at_mark(textbuf, &start_iter, body_start);
+
+ body_end = gtk_text_buffer_get_mark(textbuf, "body_end");
+ if (body_end != NULL) /* Just in case */
+ gtk_text_buffer_get_iter_at_mark(textbuf, &end_iter, body_end);
+ else
+ gtk_text_buffer_get_end_iter(textbuf, &end_iter);
+ }
+
+ return gtk_text_buffer_get_text(textbuf, &start_iter, &end_iter, FALSE);
+ }
return text;
}
static void save_as_cb(GtkAction *action, gpointer data)
{
MessageView *messageview = (MessageView *)data;
- messageview_save_as(messageview);
+ summary_save_as(messageview->mainwin->summaryview);
}
static void print_mimeview(MimeView *mimeview, gint sel_start, gint sel_end, gint partnum)
{
MessageView *messageview = (MessageView *)data;
messageview->updating = TRUE;
- summary_step(messageview->mainwin->summaryview, GTK_SCROLL_STEP_BACKWARD);
+ summary_select_prev(messageview->mainwin->summaryview);
messageview->updating = FALSE;
if (messageview->deferred_destroy) {
{
MessageView *messageview = (MessageView *)data;
messageview->updating = TRUE;
- summary_step(messageview->mainwin->summaryview, GTK_SCROLL_STEP_FORWARD);
+ summary_select_next(messageview->mainwin->summaryview);
messageview->updating = FALSE;
if (messageview->deferred_destroy) {
messageview_show(messageview, info,
messageview->all_headers);
messageview->updating = FALSE;
- procmsg_msginfo_free(info);
+ procmsg_msginfo_free(&info);
if (messageview->deferred_destroy) {
debug_print("messageview got away!\n");
messageview_destroy(messageview);
messageview_show(messageview, info,
messageview->all_headers);
messageview->updating = FALSE;
- procmsg_msginfo_free(info);
+ procmsg_msginfo_free(&info);
if (messageview->deferred_destroy) {
debug_print("messageview got away!\n");
messageview_destroy(messageview);
MessageView *messageview = (MessageView *)data;
messageview->updating = TRUE;
- folderview_select_next_with_flag(messageview->mainwin->folderview, MSG_UNREAD, FALSE);
+ folderview_select_next_with_flag(messageview->mainwin->folderview, MSG_UNREAD);
messageview->updating = FALSE;
if (messageview->deferred_destroy) {
static void goto_folder_cb(GtkAction *action, gpointer data)
{
MessageView *messageview = (MessageView *)data;
- messageview->updating = TRUE;
FolderItem *to_folder;
- messageview->updating = FALSE;
- to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE);
+ to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE,
+ _("Select folder to go to"));
if (to_folder) {
folderview_select(messageview->mainwin->folderview, to_folder);
if (!msginfo) return;
messageview->msginfo = NULL;
messageview_show(messageview, msginfo, messageview->all_headers);
- procmsg_msginfo_free(msginfo);
+ procmsg_msginfo_free(&msginfo);
main_window_set_menu_sensitive(messageview->mainwin);
summary_redisplay_msg(messageview->mainwin->summaryview);
}
messageview->msginfo = NULL;
messageview_show(messageview, msginfo,
messageview->all_headers);
- procmsg_msginfo_free(msginfo);
+ procmsg_msginfo_free(&msginfo);
/* update main window */
main_window_set_menu_sensitive(messageview->mainwin);
static void addressbook_open_cb(GtkAction *action, gpointer data)
{
-#ifndef USE_NEW_ADDRBOOK
+#ifndef USE_ALT_ADDRBOOK
addressbook_open(NULL);
#else
GError* error = NULL;
addressbook_dbus_open(FALSE, &error);
if (error) {
- g_warning("Failed to open address book");
- g_warning("%s", error->message);
+ g_warning("Failed to open address book: %s", error->message);
g_error_free(error);
}
#endif
avatarr = avatars_avatarrender_new(full_msginfo);
hooks_invoke(AVATAR_IMAGE_RENDER_HOOKLIST, avatarr);
- procmsg_msginfo_free(full_msginfo);
+ procmsg_msginfo_free(&full_msginfo);
if (avatarr->image != NULL)
picture = gtk_image_get_pixbuf(GTK_IMAGE(avatarr->image));
-#ifndef USE_NEW_ADDRBOOK
+#ifndef USE_ALT_ADDRBOOK
addressbook_add_contact(msginfo->fromname, from, NULL, picture);
#else
if (addressadd_selection(msginfo->fromname, from, NULL, picture)) {