From d285bdfc245a9e9ed8dc12a4ff8539dd21544d82 Mon Sep 17 00:00:00 2001 From: Colin Leroy Date: Fri, 28 Sep 2018 10:33:20 +0200 Subject: [PATCH] Fix bug #3889, "Address and quoted message inconsistent in reply" * Fix right-click replying to messages in summaryview * Fix corner-case when selected and opened messages are different, and one of them is to a mailing-list. --- src/compose.c | 18 ++++++++---- src/mainwindow.c | 8 ++++- src/summaryview.c | 74 +++++++++++++++++++++++++++++++++++++++-------- src/summaryview.h | 5 +++- src/toolbar.c | 9 +++++- 5 files changed, 94 insertions(+), 20 deletions(-) diff --git a/src/compose.c b/src/compose.c index 7aaa2b89f..1aa2dc48d 100644 --- a/src/compose.c +++ b/src/compose.c @@ -12150,11 +12150,9 @@ static void compose_reply_from_messageview_real(MessageView *msgview, GSList *ms Compose *compose = NULL; gchar *s_system = NULL; - cm_return_if_fail(msgview != NULL); - cm_return_if_fail(msginfo_list != NULL); - if (g_slist_length(msginfo_list) == 1 && !opening_multiple) { + if (g_slist_length(msginfo_list) == 1 && !opening_multiple && msgview != NULL) { MimeInfo *mimeinfo = messageview_get_selected_mime_part(msgview); MsgInfo *orig_msginfo = (MsgInfo *)msginfo_list->data; @@ -12179,7 +12177,7 @@ static void compose_reply_from_messageview_real(MessageView *msgview, GSList *ms } } - if (!opening_multiple) + if (!opening_multiple && msgview != NULL) body = messageview_get_selection(msgview); if (new_msglist) { @@ -12205,6 +12203,7 @@ void compose_reply_from_messageview(MessageView *msgview, GSList *msginfo_list, guint action) { if ((!prefs_common.forward_as_attachment || action != COMPOSE_FORWARD) + && msginfo_list != NULL && action != COMPOSE_FORWARD_AS_ATTACH && g_slist_length(msginfo_list) > 1) { GSList *cur = msginfo_list; gchar *msg = g_strdup_printf(_("You are about to reply to %d " @@ -12232,7 +12231,16 @@ void compose_reply_from_messageview(MessageView *msgview, GSList *msginfo_list, } else { /* forwarding multiple mails as attachments is done via a * single compose window */ - compose_reply_from_messageview_real(msgview, msginfo_list, action, FALSE); + if (msginfo_list != NULL) { + compose_reply_from_messageview_real(msgview, msginfo_list, action, FALSE); + } else if (msgview != NULL) { + GSList tmplist; + tmplist.data = msgview->msginfo; + tmplist.next = NULL; + compose_reply_from_messageview_real(msgview, &tmplist, action, FALSE); + } else { + debug_print("Nothing to reply to\n"); + } } } diff --git a/src/mainwindow.c b/src/mainwindow.c index 40fe077d7..930c71e4d 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -4120,7 +4120,13 @@ static void main_window_reply_cb(GtkAction *gaction, gpointer data) msginfo_list = summary_get_selection(mainwin->summaryview); cm_return_if_fail(msginfo_list != NULL); - compose_reply_from_messageview(msgview, msginfo_list, action); + + if (summary_is_opened_message_selected(mainwin->summaryview)) { + compose_reply_from_messageview(msgview, msginfo_list, action); + } else { + compose_reply_from_messageview(msgview, NULL, action); + } + g_slist_free(msginfo_list); } diff --git a/src/summaryview.c b/src/summaryview.c index 0f7a6bdfc..522a12667 100644 --- a/src/summaryview.c +++ b/src/summaryview.c @@ -418,16 +418,21 @@ GtkTargetEntry summary_drag_types[3] = {"claws-mail/msg-path-list", 0, TARGET_MAIL_CM_PATH_LIST}, }; -#define DO_ACTION(name, act) { \ - if(!strcmp(name, a_name)) { \ - act; \ - } \ -} +static void summary_reply_cb(GtkAction *gaction, gpointer data); +/* Only submenus and specifically-handled menu entries here */ static GtkActionEntry summary_popup_entries[] = { {"SummaryViewPopup", NULL, "SummaryViewPopup", NULL, NULL, NULL }, + {"SummaryViewPopup/Reply", NULL, N_("_Reply"), NULL, NULL, G_CALLBACK(summary_reply_cb) }, /* COMPOSE_REPLY */ {"SummaryViewPopup/ReplyTo", NULL, N_("Repl_y to"), NULL, NULL, NULL }, + {"SummaryViewPopup/ReplyTo/All", NULL, N_("_All"), NULL, NULL, G_CALLBACK(summary_reply_cb) }, /* COMPOSE_REPLY_TO_ALL */ + {"SummaryViewPopup/ReplyTo/Sender", NULL, N_("_Sender"), NULL, NULL, G_CALLBACK(summary_reply_cb) }, /* COMPOSE_REPLY_TO_SENDER */ + {"SummaryViewPopup/ReplyTo/List", NULL, N_("Mailing _list"), NULL, NULL, G_CALLBACK(summary_reply_cb) }, /* COMPOSE_REPLY_TO_LIST */ + + {"SummaryViewPopup/Forward", NULL, N_("_Forward"), NULL, NULL, G_CALLBACK(summary_reply_cb) }, /* COMPOSE_FORWARD_INLINE */ + {"SummaryViewPopup/ForwardAtt", NULL, N_("For_ward as attachment"), NULL, NULL, G_CALLBACK(summary_reply_cb) }, /* COMPOSE_FORWARD_AS_ATTACH */ + {"SummaryViewPopup/Redirect", NULL, N_("Redirec_t"), NULL, NULL, G_CALLBACK(summary_reply_cb) }, /* COMPOSE_REDIRECT */ {"SummaryViewPopup/Mark", NULL, N_("_Mark"), NULL, NULL, NULL }, {"SummaryViewPopup/ColorLabel", NULL, N_("Color la_bel"), NULL, NULL, NULL }, {"SummaryViewPopup/Tags", NULL, N_("Ta_gs"), NULL, NULL, NULL }, @@ -659,17 +664,21 @@ SummaryView *summary_create(MainWindow *mainwin) gtk_action_group_add_actions(mainwin->action_group, summary_popup_entries, G_N_ELEMENTS(summary_popup_entries), (gpointer)summaryview); + summaryview->ui_manager = gtk_ui_manager_new(); + summaryview->action_group = cm_menu_create_action_group_full(summaryview->ui_manager,"Menu", summary_popup_entries, + G_N_ELEMENTS(summary_popup_entries), (gpointer)summaryview); + MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menus", "Menus", GTK_UI_MANAGER_MENUBAR) MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus", "SummaryViewPopup", "SummaryViewPopup", GTK_UI_MANAGER_MENU) - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "Reply", "Message/Reply", GTK_UI_MANAGER_MENUITEM) + MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "Reply", "SummaryViewPopup/Reply", GTK_UI_MANAGER_MENUITEM) #ifndef GENERIC_UMPC MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "ReplyTo", "SummaryViewPopup/ReplyTo", GTK_UI_MANAGER_MENU) MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "Separator1", "Message/---", GTK_UI_MANAGER_SEPARATOR) #endif - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "Forward", "Message/Forward", GTK_UI_MANAGER_MENUITEM) + MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "Forward", "SummaryViewPopup/Forward", GTK_UI_MANAGER_MENUITEM) #ifndef GENERIC_UMPC - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "ForwardAtt", "Message/ForwardAtt", GTK_UI_MANAGER_MENUITEM) - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "Redirect", "Message/Redirect", GTK_UI_MANAGER_MENUITEM) + MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "ForwardAtt", "SummaryViewPopup/ForwardAtt", GTK_UI_MANAGER_MENUITEM) + MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "Redirect", "SummaryViewPopup/Redirect", GTK_UI_MANAGER_MENUITEM) #endif MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "Separator2", "Message/---", GTK_UI_MANAGER_SEPARATOR) MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "Move", "Message/Move", GTK_UI_MANAGER_MENUITEM) @@ -701,9 +710,9 @@ SummaryView *summary_create(MainWindow *mainwin) MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup", "Separator6", "File/---", GTK_UI_MANAGER_SEPARATOR) /* submenus - replyto */ - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/ReplyTo", "All", "Message/ReplyTo/All", GTK_UI_MANAGER_MENUITEM) - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/ReplyTo", "Sender", "Message/ReplyTo/Sender", GTK_UI_MANAGER_MENUITEM) - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/ReplyTo", "MailingList", "Message/ReplyTo/List", GTK_UI_MANAGER_MENUITEM) + MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/ReplyTo", "All", "SummaryViewPopup/ReplyTo/All", GTK_UI_MANAGER_MENUITEM) + MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/ReplyTo", "Sender", "SummaryViewPopup/ReplyTo/Sender", GTK_UI_MANAGER_MENUITEM) + MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/ReplyTo", "MailingList", "SummaryViewPopup/ReplyTo/List", GTK_UI_MANAGER_MENUITEM) /* submenus - mark */ MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menus/SummaryViewPopup/Mark", "Mark", "Message/Mark/Mark", GTK_UI_MANAGER_MENUITEM) @@ -8398,3 +8407,44 @@ void summaryview_unlock(SummaryView *summaryview, FolderItem *item) { gtk_widget_set_sensitive(summaryview->ctree, TRUE); } + +#define DO_ACTION(name, act) { if (!strcmp(a_name, name)) action = act; } +static void summary_reply_cb(GtkAction *gaction, gpointer data) +{ + SummaryView *summaryview = (SummaryView *)data; + GSList *msginfo_list = NULL; + gint action = COMPOSE_REPLY; + const gchar *a_name = gtk_action_get_name(gaction); + + DO_ACTION("SummaryViewPopup/Reply", COMPOSE_REPLY); + DO_ACTION("SummaryViewPopup/ReplyTo/All", COMPOSE_REPLY_TO_ALL); + DO_ACTION("SummaryViewPopup/ReplyTo/Sender", COMPOSE_REPLY_TO_SENDER); + DO_ACTION("SummaryViewPopup/ReplyTo/List", COMPOSE_REPLY_TO_LIST); + DO_ACTION("SummaryViewPopup/Forward", COMPOSE_FORWARD_INLINE); + DO_ACTION("SummaryViewPopup/ForwardAtt", COMPOSE_FORWARD_AS_ATTACH); + DO_ACTION("SummaryViewPopup/Redirect", COMPOSE_REDIRECT); + + msginfo_list = summary_get_selection(summaryview); + cm_return_if_fail(msginfo_list != NULL); + compose_reply_from_messageview(NULL, msginfo_list, action); + g_slist_free(msginfo_list); +} + +gboolean summary_is_opened_message_selected(SummaryView *summaryview) +{ + GList *sel = NULL; + + cm_return_val_if_fail(summaryview != NULL, FALSE); + + sel = GTK_CMCLIST(summaryview->ctree)->selection; + + cm_return_val_if_fail(sel != NULL, FALSE); + + for ( ; sel != NULL; sel = sel->next) { + if (summaryview->displayed == GTK_CMCTREE_NODE(sel->data)) { + return TRUE; + } + } + return FALSE; +} + diff --git a/src/summaryview.h b/src/summaryview.h index 258672c73..e00f133e9 100644 --- a/src/summaryview.h +++ b/src/summaryview.h @@ -110,7 +110,6 @@ struct _SummaryView GtkWidget *popupmenu; GtkWidget *colorlabel_menu; GtkWidget *tags_menu; - GtkWidget *window; GtkCMCTreeNode *selected; @@ -174,6 +173,9 @@ private: FolderItem *search_root_folder; guint mark_as_read_timeout_tag; + + GtkActionGroup *action_group; + GtkUIManager *ui_manager; }; SummaryView *summary_create(MainWindow *mainwin); @@ -333,4 +335,5 @@ void summary_relayout(SummaryView *summaryview); void summary_update_unread(SummaryView *summaryview, FolderItem *removed_item); gboolean summary_is_list(SummaryView *summaryview); gboolean summaryview_search_root_progress(gpointer data, guint at, guint matched, guint total); +gboolean summary_is_opened_message_selected(SummaryView *summaryview); #endif /* __SUMMARY_H__ */ diff --git a/src/toolbar.c b/src/toolbar.c index 15b05b5f4..9fcb7eaf9 100644 --- a/src/toolbar.c +++ b/src/toolbar.c @@ -2966,6 +2966,7 @@ static void toolbar_reply(gpointer data, guint action) MainWindow *mainwin; MessageView *msgview; GSList *msginfo_list = NULL; + gboolean msg_is_selected = FALSE; cm_return_if_fail(toolbar_item != NULL); @@ -2974,11 +2975,13 @@ static void toolbar_reply(gpointer data, guint action) mainwin = (MainWindow*)toolbar_item->parent; msginfo_list = summary_get_selection(mainwin->summaryview); msgview = (MessageView*)mainwin->messageview; + msg_is_selected = summary_is_opened_message_selected(mainwin->summaryview); break; case TOOLBAR_MSGVIEW: msgview = (MessageView*)toolbar_item->parent; cm_return_if_fail(msgview != NULL); msginfo_list = g_slist_append(msginfo_list, msgview->msginfo); + msg_is_selected = TRUE; break; default: return; @@ -2986,7 +2989,11 @@ static void toolbar_reply(gpointer data, guint action) cm_return_if_fail(msgview != NULL); cm_return_if_fail(msginfo_list != NULL); - compose_reply_from_messageview(msgview, msginfo_list, action); + if (msg_is_selected) { + compose_reply_from_messageview(msgview, msginfo_list, action); + } else { + compose_reply_from_messageview(msgview, NULL, action); + } g_slist_free(msginfo_list); /* TODO: update reply state ion summaryview */ -- 2.25.1