add 'fast filter' for claws' filtering
[claws.git] / src / summaryview.c
index ff17523bbf9905695d8dc0c2b2f86f0780b3da72..a7a75f87e082b839e3ea4bf10800405c101751f4 100644 (file)
@@ -847,12 +847,6 @@ gboolean summary_show(SummaryView *summaryview, FolderItem *item,
 
        g_slist_free(mlist);
 
-       summaryview->folder_item->new    = summaryview->newmsgs;
-       summaryview->folder_item->unread = summaryview->unread;
-       summaryview->folder_item->total  = summaryview->messages;
-       folderview_update_msg_num(summaryview->folderview,
-                                 summaryview->folderview->opened);
-
        summary_write_cache(summaryview);
 
        gtk_signal_handler_unblock_by_data(GTK_OBJECT(ctree), summaryview);
@@ -1678,10 +1672,6 @@ static void summary_status_show(SummaryView *summaryview)
                return;
        }
 
-       summaryview->newmsgs    = summaryview->folder_item->new;
-       summaryview->unread     = summaryview->folder_item->unread;
-       summaryview->messages   = summaryview->folder_item->total;
-
        rowlist = GTK_CLIST(summaryview->ctree)->selection;
        for (cur = rowlist; cur != NULL; cur = cur->next) {
                msginfo = gtk_ctree_node_get_row_data
@@ -1691,11 +1681,16 @@ static void summary_status_show(SummaryView *summaryview)
                n_selected++;
        }
 
-       gtk_label_set(GTK_LABEL(summaryview->statlabel_folder),
-                     summaryview->folder_item &&
-                     summaryview->folder_item->folder->type == F_NEWS
-                     ? g_basename(summaryview->folder_item->path)
-                     : summaryview->folder_item->path);
+       if (summaryview->folder_item->folder->type == F_NEWS) {
+               gchar *group;
+               group = get_abbrev_newsgroup_name
+                       (g_basename(summaryview->folder_item->path));
+               gtk_label_set(GTK_LABEL(summaryview->statlabel_folder), group);
+               g_free(group);
+       } else {
+               gtk_label_set(GTK_LABEL(summaryview->statlabel_folder),
+                             summaryview->folder_item->path);
+       }
 
        if (summaryview->deleted)
                del = g_strdup_printf(_("%d deleted"), summaryview->deleted);
@@ -1755,6 +1750,13 @@ static void summary_status_show(SummaryView *summaryview)
        }
        gtk_label_set(GTK_LABEL(summaryview->statlabel_msgs), str);
        g_free(str);
+
+       summaryview->folder_item->new    = summaryview->newmsgs;
+       summaryview->folder_item->unread = summaryview->unread;
+       summaryview->folder_item->total  = summaryview->messages;
+
+       folderview_update_msg_num(summaryview->folderview,
+                                 summaryview->folderview->opened);
 }
 
 static void summary_set_column_titles(SummaryView *summaryview)
@@ -2310,16 +2312,19 @@ static void summary_display_msg_full(SummaryView *summaryview,
        }
        g_free(filename);
 
-/* NOT NEEDED ANYMORE
        if (MSG_IS_NEW(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
                summaryview->newmsgs--;
        if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
                summaryview->unread--;
-*/
-       procmsg_msginfo_unset_flags(msginfo, MSG_NEW | MSG_UNREAD, 0);
-       summary_set_row_marks(summaryview, row);
-       gtk_clist_thaw(GTK_CLIST(ctree));
-       summary_status_show(summaryview);
+       if (MSG_IS_NEW(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags) || 
+           MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags)) {
+               MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_NEW | MSG_UNREAD);
+               if (MSG_IS_IMAP(msginfo->flags))
+                       imap_msg_unset_perm_flags(msginfo, MSG_NEW | MSG_UNREAD);
+               summary_set_row_marks(summaryview, row);
+               gtk_clist_thaw(GTK_CLIST(ctree));
+               summary_status_show(summaryview);
+       }
 
        flags = msginfo->flags;
 
@@ -2347,6 +2352,14 @@ static void summary_display_msg_full(SummaryView *summaryview,
                gtkut_ctree_node_move_if_on_the_edge(ctree, row);
        }
 
+       if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags) ||
+           (MSG_IS_MIME(msginfo->flags) - MSG_IS_MIME(flags) != 0)) {
+               MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_NEW | MSG_UNREAD);
+               CHANGE_FLAGS(msginfo);
+               summary_set_row_marks(summaryview, row);
+               gtk_clist_thaw(GTK_CLIST(ctree));
+               summary_status_show(summaryview);
+       }
        summary_set_menu_sensitive(summaryview);
        main_window_set_toolbar_sensitive(summaryview->mainwin);
 
@@ -2709,8 +2722,12 @@ static void summary_mark_row(SummaryView *summaryview, GtkCTreeNode *row)
                        folderview_update_item(msginfo->to_folder, 0);
        }
        msginfo->to_folder = NULL;
-       procmsg_msginfo_unset_flags(msginfo, MSG_DELETED, MSG_MOVE | MSG_COPY);
-       procmsg_msginfo_set_flags(msginfo, MSG_MARKED, 0);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
+       MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY);
+       MSG_SET_PERM_FLAGS(msginfo->flags, MSG_MARKED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_set_perm_flags(msginfo, MSG_MARKED);
+       CHANGE_FLAGS(msginfo);
        summary_set_row_marks(summaryview, row);
        debug_print(_("Message %s/%d is marked\n"), msginfo->folder->path, msginfo->msgnum);
 }
@@ -2739,8 +2756,12 @@ static void summary_lock_row(SummaryView *summaryview, GtkCTreeNode *row)
                        folderview_update_item(msginfo->to_folder, 0);
        }
        msginfo->to_folder = NULL;
-       procmsg_msginfo_unset_flags(msginfo, MSG_DELETED, MSG_MOVE | MSG_COPY);
-       procmsg_msginfo_set_flags(msginfo, MSG_LOCKED, 0);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
+       MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY);
+       MSG_SET_PERM_FLAGS(msginfo->flags, MSG_LOCKED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_set_perm_flags(msginfo, MSG_LOCKED);
+       CHANGE_FLAGS(msginfo);
        summary_set_row_marks(summaryview, row);
        debug_print(_("Message %d is locked\n"), msginfo->msgnum);
 }
@@ -2764,16 +2785,20 @@ static void summary_mark_row_as_read(SummaryView *summaryview,
        MsgInfo *msginfo;
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
-/* NOT NEEDED ANYMORE
        if (MSG_IS_NEW(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
                summaryview->newmsgs--;
        if (MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
                summaryview->unread--;
-*/
-       procmsg_msginfo_unset_flags(msginfo, MSG_NEW | MSG_UNREAD, 0);
-       summary_set_row_marks(summaryview, row);
-       debug_print(_("Message %d is marked as read\n"),
-               msginfo->msgnum);
+       if (MSG_IS_NEW(msginfo->flags) ||
+           MSG_IS_UNREAD(msginfo->flags)) {
+               MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_NEW | MSG_UNREAD);
+               if (MSG_IS_IMAP(msginfo->flags))
+                       imap_msg_unset_perm_flags(msginfo, MSG_NEW | MSG_UNREAD);
+               CHANGE_FLAGS(msginfo);
+               summary_set_row_marks(summaryview, row);
+               debug_print(_("Message %d is marked as read\n"),
+                           msginfo->msgnum);
+       }
 }
 
 void summary_mark_as_read(SummaryView *summaryview)
@@ -2817,18 +2842,22 @@ static void summary_mark_row_as_unread(SummaryView *summaryview,
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
        if (MSG_IS_DELETED(msginfo->flags)) {
                msginfo->to_folder = NULL;
-               procmsg_msginfo_unset_flags(msginfo, MSG_DELETED, 0);
+               MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
                summaryview->deleted--;
        }
-/* NOT NEEDED ANYMORE
-       if (!MSG_IS_UNREAD(msginfo->flags) && !MSG_IS_IGNORE_THREAD(msginfo->flags))
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_REPLIED | MSG_FORWARDED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_unset_perm_flags(msginfo, MSG_REPLIED);
+       if (!MSG_IS_UNREAD(msginfo->flags)) {
+               MSG_SET_PERM_FLAGS(msginfo->flags, MSG_UNREAD);
+               if (MSG_IS_IMAP(msginfo->flags))
+                       imap_msg_set_perm_flags(msginfo, MSG_UNREAD);
                summaryview->unread++;
-*/
+               debug_print(_("Message %d is marked as unread\n"),
+                           msginfo->msgnum);
+       }
 
-       procmsg_msginfo_unset_flags(msginfo, MSG_REPLIED | MSG_FORWARDED, 0);
-       procmsg_msginfo_set_flags(msginfo, MSG_UNREAD, 0);
-       debug_print(_("Message %d is marked as unread\n"),
-               msginfo->msgnum);
+       CHANGE_FLAGS(msginfo);
 
        summary_set_row_marks(summaryview, row);
 }
@@ -2923,8 +2952,12 @@ static void summary_delete_row(SummaryView *summaryview, GtkCTreeNode *row)
                        folderview_update_item(msginfo->to_folder, 0);
        }
        msginfo->to_folder = NULL;
-       procmsg_msginfo_unset_flags(msginfo, MSG_MARKED, MSG_MOVE | MSG_COPY);
-       procmsg_msginfo_set_flags(msginfo, MSG_DELETED, 0);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_unset_perm_flags(msginfo, MSG_MARKED);
+       MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY);
+       MSG_SET_PERM_FLAGS(msginfo->flags, MSG_DELETED);
+       CHANGE_FLAGS(msginfo);
        summaryview->deleted++;
 
        if (!prefs_common.immediate_exec && 
@@ -3050,7 +3083,11 @@ static void summary_unmark_row(SummaryView *summaryview, GtkCTreeNode *row)
                        folderview_update_item(msginfo->to_folder, 0);
        }
        msginfo->to_folder = NULL;
-       procmsg_msginfo_unset_flags(msginfo, MSG_MARKED | MSG_DELETED, MSG_MOVE | MSG_COPY);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED | MSG_DELETED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_unset_perm_flags(msginfo, MSG_MARKED);
+       MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE | MSG_COPY);
+       CHANGE_FLAGS(msginfo);
        summary_set_row_marks(summaryview, row);
        debug_print(_("Message %s/%d is unmarked\n"),
                    msginfo->folder->path, msginfo->msgnum);
@@ -3094,9 +3131,12 @@ static void summary_move_row_to(SummaryView *summaryview, GtkCTreeNode *row,
                if (!prefs_common.immediate_exec)
                        msginfo->to_folder->op_count--;
        }
-       procmsg_msginfo_unset_flags(msginfo, MSG_MARKED | MSG_DELETED, MSG_COPY);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED | MSG_DELETED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_unset_perm_flags(msginfo, MSG_MARKED);
+       MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_COPY);
        if (!MSG_IS_MOVE(msginfo->flags)) {
-               procmsg_msginfo_set_flags(msginfo, 0, MSG_MOVE);
+               MSG_SET_TMP_FLAGS(msginfo->flags, MSG_MOVE);
                summaryview->moved++;
                changed = TRUE;
        }
@@ -3183,9 +3223,12 @@ static void summary_copy_row_to(SummaryView *summaryview, GtkCTreeNode *row,
                if (!prefs_common.immediate_exec)
                        msginfo->to_folder->op_count--;
        }
-       procmsg_msginfo_unset_flags(msginfo, MSG_MARKED | MSG_DELETED, MSG_MOVE);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED | MSG_DELETED);
+       if (MSG_IS_IMAP(msginfo->flags))
+               imap_msg_unset_perm_flags(msginfo, MSG_MARKED);
+       MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_MOVE);
        if (!MSG_IS_COPY(msginfo->flags)) {
-               procmsg_msginfo_set_flags(msginfo, 0, MSG_COPY);
+               MSG_SET_TMP_FLAGS(msginfo->flags, MSG_COPY);
                summaryview->copied++;
                changed = TRUE;
        }
@@ -3307,7 +3350,10 @@ void summary_save_as(SummaryView *summaryview)
        }
 
        src = procmsg_get_message_file(msginfo);
-       copy_file(src, dest);
+       if (copy_file(src, dest) < 0) {
+               alertpanel_error(_("Can't save the file `%s'."),
+                                g_basename(dest));
+       }
        g_free(src);
 }
 
@@ -3429,7 +3475,6 @@ static void summary_execute_move(SummaryView *summaryview)
                summaryview->mlist = NULL;
        }
 
-       folderview_update_item(summaryview->folder_item, FALSE);
        g_hash_table_destroy(summaryview->folder_table);
        summaryview->folder_table = NULL;
 }
@@ -3497,7 +3542,7 @@ static void summary_execute_copy_func(GtkCTree *ctree, GtkCTreeNode *node,
                summaryview->mlist =
                        g_slist_append(summaryview->mlist, msginfo);
 
-               procmsg_msginfo_unset_flags(msginfo, 0, MSG_COPY);
+               MSG_UNSET_TMP_FLAGS(msginfo->flags, MSG_COPY);
                summary_set_row_marks(summaryview, node);
        }
 }
@@ -3534,8 +3579,8 @@ static void summary_execute_delete(SummaryView *summaryview)
 
        if ((summaryview->folder_item != trash) && (trash != NULL)) {
                folder_item_scan(trash);
+               folderview_update_item(trash, FALSE);
        }
-       folderview_update_item(summaryview->folder_item, FALSE);
 }
 
 static void summary_execute_delete_func(GtkCTree *ctree, GtkCTreeNode *node,
@@ -3890,23 +3935,42 @@ static void summary_filter_func(GtkCTree *ctree, GtkCTreeNode *node,
 
 void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
 {
-       static HeaderEntry hentry[] = {{"List-Id:",        NULL, FALSE},
+       static HeaderEntry hentry[] = {{"X-BeenThere:",    NULL, FALSE},
                                       {"X-ML-Name:",      NULL, FALSE},
                                       {"X-List:",         NULL, FALSE},
                                       {"X-Mailing-list:", NULL, FALSE},
+                                      {"List-Id:",        NULL, FALSE},
                                       {NULL,              NULL, FALSE}};
+
+       static gchar *header_strs[] = {"From", "from", "To", "to", "Subject", "subject"};
+
+       static gchar *hentry_strs[]   = {"X-BeenThere", "X-ML-Name", "X-List",
+                                        "X-Mailing-List", "List-Id",
+                                        "header \"X-BeenThere\"", "header \"X-ML-Name\"",
+                                        "header \"X-List\"", "header \"X-Mailing-List\"",
+                                        "header \"List-Id\""};
        enum
        {
-               H_LIST_ID        = 0,
+               H_X_BEENTHERE    = 0,
                H_X_ML_NAME      = 1,
                H_X_LIST         = 2,
-               H_X_MAILING_LIST = 3
+               H_X_MAILING_LIST = 3,
+               H_LIST_ID        = 4
+       };
+
+       enum
+       {
+               H_FROM    = 0,
+               H_TO      = 2,
+               H_SUBJECT = 4
        };
 
        MsgInfo *msginfo;
        gchar *header = NULL;
        gchar *key = NULL;
        FILE *fp;
+       int header_offset;
+       int hentry_offset;
 
        if (!summaryview->selected) return;
 
@@ -3914,6 +3978,15 @@ void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
                                              summaryview->selected);
        if (!msginfo) return;
 
+       if (global_processing) {
+               header_offset = 1;
+               hentry_offset = 5;
+       }
+       else {
+               header_offset = 0;
+               hentry_offset = 0;
+       }
+
        switch (type) {
        case FILTER_BY_NONE:
                break;
@@ -3922,50 +3995,58 @@ void summary_filter_open(SummaryView *summaryview, PrefsFilterType type)
                procheader_get_header_fields(fp, hentry);
                fclose(fp);
 
-               if (hentry[H_LIST_ID].body != NULL) {
-                       header = "List-Id";
-                       Xstrdup_a(key, hentry[H_LIST_ID].body, );
+               if (hentry[H_X_BEENTHERE].body != NULL) {
+                       header = hentry_strs[H_X_BEENTHERE + hentry_offset];
+                       Xstrdup_a(key, hentry[H_X_BEENTHERE].body, );
                } else if (hentry[H_X_ML_NAME].body != NULL) {
-                       header = "X-ML-Name";
+                       header = hentry_strs[H_X_ML_NAME + hentry_offset];
                        Xstrdup_a(key, hentry[H_X_ML_NAME].body, );
                } else if (hentry[H_X_LIST].body != NULL) {
-                       header = "X-List";
+                       header = hentry_strs[H_X_LIST + hentry_offset];
                        Xstrdup_a(key, hentry[H_X_LIST].body, );
                } else if (hentry[H_X_MAILING_LIST].body != NULL) {
-                       header = "X-Mailing-list";
+                       header = hentry_strs[H_X_MAILING_LIST + hentry_offset];
                        Xstrdup_a(key, hentry[H_X_MAILING_LIST].body, );
+               } else if (hentry[H_LIST_ID].body != NULL) {
+                       header = hentry_strs[H_LIST_ID + hentry_offset];
+                       Xstrdup_a(key, hentry[H_LIST_ID].body, );
                } else if (msginfo->subject) {
-                       header = "Subject";
+                       header = header_strs[H_SUBJECT + header_offset];
                        key = msginfo->subject;
                }
 
-               g_free(hentry[H_LIST_ID].body);
-               hentry[H_LIST_ID].body = NULL;
+               g_free(hentry[H_X_BEENTHERE].body);
+               hentry[H_X_BEENTHERE].body = NULL;
                g_free(hentry[H_X_ML_NAME].body);
                hentry[H_X_ML_NAME].body = NULL;
                g_free(hentry[H_X_LIST].body);
                hentry[H_X_LIST].body = NULL;
                g_free(hentry[H_X_MAILING_LIST].body);
                hentry[H_X_MAILING_LIST].body = NULL;
+               g_free(hentry[H_LIST_ID].body);
+               hentry[H_LIST_ID].body = NULL;
 
                break;
        case FILTER_BY_FROM:
-               header = "From";
+               header = header_strs[H_FROM + header_offset];
                key = msginfo->from;
                break;
        case FILTER_BY_TO:
-               header = "To";
+               header = header_strs[H_TO + header_offset];
                key = msginfo->to;
                break;
        case FILTER_BY_SUBJECT:
-               header = "Subject";
+               header = header_strs[H_SUBJECT + header_offset];
                key = msginfo->subject;
                break;
        default:
                break;
        }
 
-       prefs_filter_open(header, key);
+       if (global_processing)
+               prefs_filtering_open(NULL, header, key);
+       else
+               prefs_filter_open(header, key);
 }
 
 void summary_reply(SummaryView *summaryview, ComposeMode mode)
@@ -4087,8 +4168,8 @@ void summary_set_colorlabel_color(GtkCTree *ctree, GtkCTreeNode *node,
        gint color_index;
 
        msginfo = gtk_ctree_node_get_row_data(ctree, node);
-       procmsg_msginfo_unset_flags(msginfo, MSG_CLABEL_FLAG_MASK, 0);
-       procmsg_msginfo_set_flags(msginfo, MSG_COLORLABEL_TO_FLAGS(labelcolor), 0);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_CLABEL_FLAG_MASK);
+       MSG_SET_COLORLABEL_VALUE(msginfo->flags, labelcolor);
 
        color_index = labelcolor == 0 ? -1 : (gint)labelcolor - 1;
        ctree_style = gtk_widget_get_style(GTK_WIDGET(ctree));
@@ -4563,7 +4644,10 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
        switch (column < 0 ? column : summaryview->col_state[column].type) {
        case S_COL_MARK:
                if (MSG_IS_MARKED(msginfo->flags)) {
-                       procmsg_msginfo_unset_flags(msginfo, MSG_MARKED, 0);
+                       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_MARKED);
+                       if (MSG_IS_IMAP(msginfo->flags))
+                               imap_msg_unset_perm_flags(msginfo, MSG_MARKED);
+                       CHANGE_FLAGS(msginfo);
                        summary_set_row_marks(summaryview, row);
                } else
                        summary_mark_row(summaryview, row);
@@ -4580,7 +4664,8 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
                break;
        case S_COL_LOCKED:
                if (MSG_IS_LOCKED(msginfo->flags)) {
-                       procmsg_msginfo_unset_flags(msginfo, MSG_LOCKED, 0);
+                       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_LOCKED);
+                       CHANGE_FLAGS(msginfo);
                        summary_set_row_marks(summaryview, row);
                }
                else
@@ -4968,13 +5053,13 @@ static void summary_ignore_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpoin
        MsgInfo *msginfo;
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
-/* NOT NEEDED ANYMORE
        if (MSG_IS_NEW(msginfo->flags))
                summaryview->newmsgs--;
        if (MSG_IS_UNREAD(msginfo->flags))
                summaryview->unread--;
-*/
-       procmsg_msginfo_set_flags(msginfo, MSG_IGNORE_THREAD, 0);
+       MSG_SET_PERM_FLAGS(msginfo->flags, MSG_IGNORE_THREAD);
+
+       CHANGE_FLAGS(msginfo);
 
        summary_set_row_marks(summaryview, row);
        debug_print(_("Message %d is marked as ignore thread\n"),
@@ -5000,14 +5085,14 @@ static void summary_unignore_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpo
        MsgInfo *msginfo;
 
        msginfo = gtk_ctree_node_get_row_data(ctree, row);
-/* NOT NEEDED ANYMORE
        if (MSG_IS_NEW(msginfo->flags))
                summaryview->newmsgs++;
        if (MSG_IS_UNREAD(msginfo->flags))
                summaryview->unread++;
-*/
-       procmsg_msginfo_unset_flags(msginfo, MSG_IGNORE_THREAD, 0);
+       MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_IGNORE_THREAD);
 
+       CHANGE_FLAGS(msginfo);
+               
        summary_set_row_marks(summaryview, row);
        debug_print(_("Message %d is marked as unignore thread\n"),
            msginfo->msgnum);