Fix bug #3889, "Address and quoted message inconsistent in reply"
authorColin Leroy <colin@colino.net>
Fri, 28 Sep 2018 08:33:20 +0000 (10:33 +0200)
committerColin Leroy <colin@colino.net>
Fri, 28 Sep 2018 08:44:33 +0000 (10:44 +0200)
* 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
src/mainwindow.c
src/summaryview.c
src/summaryview.h
src/toolbar.c

index 7aaa2b8..1aa2dc4 100644 (file)
@@ -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");
+               }
        }
 }
 
index 40fe077..930c71e 100644 (file)
@@ -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);
 }
 
index 0f7a6bd..522a126 100644 (file)
@@ -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;
+}
+
index 258672c..e00f133 100644 (file)
@@ -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__ */
index 15b05b5..9fcb7ea 100644 (file)
@@ -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 */