2006-09-13 [colin] 2.4.0cvs185
[claws.git] / src / summaryview.c
index 8b772287a6e06fb73c841bdefd8f1c98b6254acd..dc224dc24f6162093c25f945751e6c44c19dc592 100644 (file)
@@ -230,8 +230,6 @@ static void summary_execute_delete_func     (GtkCTree               *ctree,
                                         gpointer                data);
 
 static void summary_thread_init                (SummaryView            *summaryview);
-static void summary_ignore_thread      (SummaryView            *summaryview);
-static void summary_unignore_thread     (SummaryView            *summaryview);
 
 static void summary_unthread_for_exec          (SummaryView    *summaryview);
 static void summary_unthread_for_exec_func     (GtkCTree       *ctree,
@@ -473,8 +471,8 @@ static GtkItemFactoryEntry summary_popup_entries[] =
        {N_("/_View"),                  NULL, NULL,             0, "<Branch>"},
        {N_("/_View/Open in new _window"),
                                        "<control><alt>N", summary_open_msg,    0, NULL},
-       {N_("/_View/_Source"),          "<control>U", summary_view_source, 0, NULL},
-       {N_("/_View/All _header"),      "<control>H", summary_show_all_header_cb, 0, "<ToggleItem>"},
+       {N_("/_View/Message _source"),  "<control>U", summary_view_source, 0, NULL},
+       {N_("/_View/All _headers"),     "<control>H", summary_show_all_header_cb, 0, "<ToggleItem>"},
        {N_("/---"),                    NULL, NULL,             0, "<Separator>"},
        {N_("/_Save as..."),            "<control>S", summary_save_as,   0, NULL},
        {N_("/_Print..."),              "<control>P", summary_print,   0, NULL},
@@ -494,10 +492,10 @@ static const gchar *const col_label[N_SUMMARY_COLS] = {
        "",             /* S_COL_LOCKED  */
 };
 
-#define START_LONG_OPERATION(summaryview) {                    \
+#define START_LONG_OPERATION(summaryview,force_freeze) {       \
        summary_lock(summaryview);                              \
        main_window_cursor_wait(summaryview->mainwin);          \
-       if (sc_g_list_bigger(GTK_CLIST(summaryview->ctree)->selection, 1)) {\
+       if (force_freeze || sc_g_list_bigger(GTK_CLIST(summaryview->ctree)->selection, 1)) {\
                froze = TRUE;                                           \
                gtk_clist_freeze(GTK_CLIST(summaryview->ctree));        \
        }                                                       \
@@ -849,6 +847,37 @@ static gboolean summaryview_quicksearch_recurse(gpointer data)
        main_window_cursor_normal(summaryview->mainwin);
        return FALSE;
 }
+
+static gboolean summary_check_consistency(FolderItem *item, GSList *mlist)
+{
+       int u = 0, n = 0, m = 0, t = 0;
+       GSList *cur;
+       START_TIMING("consistency check");
+       for(cur = mlist ; cur != NULL && cur->data != NULL ; cur = g_slist_next(cur)) {
+               MsgInfo * msginfo = (MsgInfo *) cur->data;
+               t++;
+               if (MSG_IS_NEW(msginfo->flags))
+                       n++;
+               if (MSG_IS_UNREAD(msginfo->flags))
+                       u++;
+               if (MSG_IS_MARKED(msginfo->flags))
+                       m++;            
+       }
+       if (t != item->total_msgs
+       ||  n != item->new_msgs
+       ||  u != item->unread_msgs
+       ||  m != item->marked_msgs
+       ||  (m == 0 && item->unreadmarked_msgs != 0)
+       ||  item->unreadmarked_msgs < 0) {
+               debug_print("Inconsistency\n");
+               folder_item_scan_full(item, FALSE);
+               END_TIMING();
+               return FALSE;
+       } 
+       END_TIMING();
+       return TRUE;
+}
+
 gboolean summary_show(SummaryView *summaryview, FolderItem *item)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
@@ -967,6 +996,12 @@ START_TIMING("--------- summary_show");
 
        mlist = folder_item_get_msg_list(item);
 
+       if (!summary_check_consistency(item, mlist)) {
+               debug_print("reloading due to inconsistency\n");
+               procmsg_msg_list_free(mlist);
+               mlist = folder_item_get_msg_list(item);
+       }
+
        if (summaryview->folder_item->hide_read_msgs &&
            quicksearch_is_active(summaryview->quicksearch) == FALSE) {
                GSList *not_killed;
@@ -1365,6 +1400,7 @@ void summary_set_menu_sensitive(SummaryView *summaryview)
                {"/Mark/Mark as unread"         , M_TARGET_EXIST},
                {"/Mark/Mark all read"          , M_TARGET_EXIST},
                {"/Mark/Ignore thread"          , M_TARGET_EXIST},
+               {"/Mark/Unignore thread"        , M_TARGET_EXIST},
                {"/Mark/Lock"                   , M_TARGET_EXIST},
                {"/Mark/Unlock"                 , M_TARGET_EXIST},
                {"/Mark/Mark as spam"           , M_TARGET_EXIST|M_CAN_LEARN_SPAM},
@@ -1377,8 +1413,8 @@ void summary_set_menu_sensitive(SummaryView *summaryview)
 
                {"/View"                        , M_SINGLE_TARGET_EXIST},
                {"/View/Open in new window"     , M_SINGLE_TARGET_EXIST},
-               {"/View/Source"                 , M_SINGLE_TARGET_EXIST},
-               {"/View/All header            , M_SINGLE_TARGET_EXIST},
+               {"/View/Message source"         , M_SINGLE_TARGET_EXIST},
+               {"/View/All headers"            , M_SINGLE_TARGET_EXIST},
                {"/Save as..."                  , M_TARGET_EXIST},
                {"/Print..."                    , M_TARGET_EXIST},
                {NULL, 0}
@@ -1395,7 +1431,7 @@ void summary_set_menu_sensitive(SummaryView *summaryview)
 
 
        summary_lock(summaryview);
-       menuitem = gtk_item_factory_get_widget(ifactory, "/View/All header");
+       menuitem = gtk_item_factory_get_widget(ifactory, "/View/All headers");
        if (summaryview->messageview 
        &&  summaryview->messageview->mimeview
        &&  summaryview->messageview->mimeview->textview)
@@ -1493,7 +1529,7 @@ void summary_select_next_unread(SummaryView *summaryview)
                        }
 
                        if (val == G_ALERTALTERNATE) {
-                               folderview_select_next_unread(summaryview->folderview);
+                               folderview_select_next_unread(summaryview->folderview, TRUE);
                                return;
                        } 
                        else
@@ -1756,6 +1792,34 @@ void summary_select_by_msgnum(SummaryView *summaryview, guint msgnum)
        summary_select_node(summaryview, node, FALSE, TRUE);
 }
 
+typedef struct _PostponedSelectData
+{
+       GtkCTree *ctree;
+       GtkCTreeNode *row;
+       GtkCTreeNode *node;
+       GtkScrollType type;
+       gint column;
+       SummaryView *summaryview;
+       gboolean display_msg;
+       gboolean do_refresh;
+} PostponedSelectData;
+
+static gboolean summary_select_retry(void *data)
+{
+       PostponedSelectData *psdata = (PostponedSelectData *)data;
+       debug_print("trying again\n");
+       if (psdata->row)
+               summary_selected(psdata->ctree, psdata->row,
+                           psdata->column, psdata->summaryview);
+       else if (psdata->node)
+               summary_select_node(psdata->summaryview, psdata->node,
+                           psdata->display_msg, psdata->do_refresh);
+       else
+               summary_step(psdata->summaryview, psdata->type);
+       g_free(psdata);
+       return FALSE;
+}
+
 /**
  * summary_select_node:
  * @summaryview: Summary view.
@@ -1772,8 +1836,28 @@ void summary_select_node(SummaryView *summaryview, GtkCTreeNode *node,
                         gboolean display_msg, gboolean do_refresh)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
-       if (summary_is_locked(summaryview))
+       
+       if (summary_is_locked(summaryview)
+       && !GTK_SCTREE(ctree)->selecting_range
+       && summaryview->messageview->mimeview
+       && summaryview->messageview->mimeview->type == MIMEVIEW_TEXT
+       && summaryview->messageview->mimeview->textview->loading) {
+               PostponedSelectData *data = g_new0(PostponedSelectData, 1);
+               summaryview->messageview->mimeview->textview->stop_loading = TRUE;
+               
+               data->ctree = ctree;
+               data->row = NULL;
+               data->node = node;
+               data->summaryview = summaryview;
+               data->display_msg = display_msg;
+               data->do_refresh = do_refresh;
+               debug_print("postponing open of message till end of load\n");
+               g_timeout_add(100, summary_select_retry, data);
+               return;
+       }
+       if (summary_is_locked(summaryview)) {
                return;
+       }
        if (!summaryview->folder_item)
                return;
        if (node) {
@@ -2948,7 +3032,25 @@ gboolean summary_step(SummaryView *summaryview, GtkScrollType type)
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        GtkCTreeNode *node;
 
-       if (summary_is_locked(summaryview)) return FALSE;
+       if (summary_is_locked(summaryview)
+       && !GTK_SCTREE(ctree)->selecting_range
+       && summaryview->messageview->mimeview
+       && summaryview->messageview->mimeview->type == MIMEVIEW_TEXT
+       && summaryview->messageview->mimeview->textview->loading) {
+               PostponedSelectData *data = g_new0(PostponedSelectData, 1);
+               summaryview->messageview->mimeview->textview->stop_loading = TRUE;
+               
+               data->ctree = ctree;
+               data->row = NULL;
+               data->node = NULL;
+               data->type = type;
+               data->summaryview = summaryview;
+               debug_print("postponing open of message till end of load\n");
+               g_timeout_add(100, summary_select_retry, data);
+               return FALSE;
+       }
+       if (summary_is_locked(summaryview))
+               return FALSE;
        if (type == GTK_SCROLL_STEP_FORWARD) {
                node = gtkut_ctree_node_next(ctree, summaryview->selected);
                if (node)
@@ -3211,7 +3313,7 @@ void summary_mark(SummaryView *summaryview)
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                summary_mark_row(summaryview, GTK_CTREE_NODE(cur->data));
@@ -3246,7 +3348,7 @@ void summary_mark_as_read
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                summary_mark_row_as_read(summaryview,
@@ -3263,7 +3365,7 @@ void summary_msgs_lock(SummaryView *summaryview)
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                summary_lock_row(summaryview,
                                         GTK_CTREE_NODE(cur->data));
@@ -3278,7 +3380,7 @@ void summary_msgs_unlock(SummaryView *summaryview)
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                summary_unlock_row(summaryview,
                                   GTK_CTREE_NODE(cur->data));
@@ -3306,7 +3408,7 @@ void summary_mark_all_read(SummaryView *summaryview)
                        prefs_common.ask_mark_all_read = FALSE;
        }
        
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, TRUE);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list); node != NULL;
             node = gtkut_ctree_node_next(ctree, node))
@@ -3334,7 +3436,7 @@ void summary_mark_as_spam(SummaryView *summaryview, guint action, GtkWidget *wid
 
        prefs_common.immediate_exec = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
 
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next) {
                GtkCTreeNode *row = GTK_CTREE_NODE(cur->data);
@@ -3411,7 +3513,7 @@ void summary_mark_as_unread(SummaryView *summaryview)
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; 
                cur = cur->next)
@@ -3567,7 +3669,7 @@ void summary_delete(SummaryView *summaryview)
 
        /* next code sets current row focus right. We need to find a row
         * that is not deleted. */
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next) {
                sel_last = GTK_CTREE_NODE(cur->data);
@@ -3644,7 +3746,7 @@ void summary_unmark(SummaryView *summaryview)
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        folder_item_set_batch(summaryview->folder_item, TRUE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                summary_unmark_row(summaryview, GTK_CTREE_NODE(cur->data));
@@ -3706,7 +3808,7 @@ void summary_move_selected_to(SummaryView *summaryview, FolderItem *to_folder)
                return;
        }
 
-       START_LONG_OPERATION(summaryview); 
+       START_LONG_OPERATION(summaryview, FALSE); 
 
        for (cur = GTK_CLIST(summaryview->ctree)->selection;
             cur != NULL && cur->data != NULL; cur = cur->next) {
@@ -3797,7 +3899,7 @@ void summary_copy_selected_to(SummaryView *summaryview, FolderItem *to_folder)
                return;
        }
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
 
        for (cur = GTK_CLIST(summaryview->ctree)->selection;
             cur != NULL && cur->data != NULL; cur = cur->next)
@@ -3952,21 +4054,6 @@ void summary_save_as(SummaryView *summaryview)
        g_free(tmp);
 }
 
-#ifdef USE_GNOMEPRINT
-static void print_mimeview(MimeView *mimeview) 
-{
-       if (!mimeview 
-       ||  !mimeview->textview
-       ||  !mimeview->textview->text)
-               alertpanel_warning(_("Cannot print: the message doesn't "
-                                    "contain text."));
-       else {
-               gtk_widget_realize(mimeview->textview->text);
-               gedit_print(GTK_TEXT_VIEW(mimeview->textview->text));
-       }
-}
-#endif
-
 void summary_print(SummaryView *summaryview)
 {
        GtkCList *clist = GTK_CLIST(summaryview->ctree);
@@ -4007,23 +4094,10 @@ void summary_print(SummaryView *summaryview)
             cur != NULL && cur->data != NULL; 
             cur = cur->next) {
                GtkCTreeNode *node = GTK_CTREE_NODE(cur->data);
-               if (node != summaryview->displayed) {
-                       MessageView *tmpview = messageview_create(
-                                               summaryview->mainwin);
-                       MsgInfo *msginfo = gtk_ctree_node_get_row_data(
-                                               GTK_CTREE(summaryview->ctree),
-                                               node);
-
-                       messageview_init(tmpview);
-                       tmpview->all_headers = summaryview->messageview->all_headers;
-                       if (msginfo && messageview_show(tmpview, msginfo, 
-                               tmpview->all_headers) >= 0) {
-                                       print_mimeview(tmpview->mimeview);
-                       }
-                       messageview_destroy(tmpview);
-               } else {
-                       print_mimeview(summaryview->messageview->mimeview);
-               }
+               MsgInfo *msginfo = gtk_ctree_node_get_row_data(
+                                       GTK_CTREE(summaryview->ctree),
+                                       node);
+               messageview_print(msginfo, summaryview->messageview->all_headers);
        }
 #endif
 }
@@ -4376,8 +4450,7 @@ static void summary_unthread_for_exec(SummaryView *summaryview)
 
        debug_print("Unthreading for execution...");
 
-       START_LONG_OPERATION(summaryview);
-
+       START_LONG_OPERATION(summaryview, TRUE);
        for (node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list);
             node != NULL; node = GTK_CTREE_NODE_NEXT(node)) {
                summary_unthread_for_exec_func(ctree, node, summaryview);
@@ -4548,7 +4621,7 @@ gboolean summary_filter_get_mode(void)
                        _("Filtering"),
                        _("There are some filtering rules that belong to an account.\n"
                          "Please choose what to do with these rules:"),
-                       _("_Filter"), _("_Cancel"), NULL, TRUE, vbox);
+                       _("_Filter"), GTK_STOCK_CANCEL, NULL, TRUE, vbox);
        if ((val & ~G_ALERTDISABLE) != G_ALERTDEFAULT) {
                return FALSE;
        } else if (val & G_ALERTDISABLE)
@@ -4759,8 +4832,7 @@ void summary_set_colorlabel(SummaryView *summaryview, guint labelcolor,
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
-
+       START_LONG_OPERATION(summaryview, FALSE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                summary_set_row_colorlabel(summaryview,
                                           GTK_CTREE_NODE(cur->data), labelcolor);
@@ -4965,6 +5037,8 @@ static GtkWidget *summary_ctree_create(SummaryView *summaryview)
                                     GTK_CTREE_EXPANDER_TRIANGLE);
        }
 
+       gtk_sctree_set_stripes(GTK_SCTREE(ctree), prefs_common.use_stripes_in_summaries);
+
        gtk_ctree_set_indent(GTK_CTREE(ctree), 12);
        g_object_set_data(G_OBJECT(ctree), "summaryview", (gpointer)summaryview); 
 
@@ -5136,12 +5210,61 @@ static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
        GtkAdjustment *adj;
        gboolean mod_pressed;
 
-       if (summary_is_locked(summaryview)) return TRUE;
-       if (!event) return TRUE;
+       if (!event) 
+               return TRUE;
 
        if (quicksearch_has_focus(summaryview->quicksearch))
                return FALSE;
 
+       messageview = summaryview->messageview;
+       textview = messageview->mimeview->textview;
+
+       mod_pressed =
+               ((event->state & (GDK_SHIFT_MASK|GDK_MOD1_MASK)) != 0);
+
+       if (summaryview->selected) {
+               gboolean handled = FALSE;
+               switch (event->keyval) {
+               case GDK_space:         /* Page down or go to the next */
+                       handled = TRUE;
+                       if (event->state & GDK_SHIFT_MASK) 
+                               mimeview_scroll_page(messageview->mimeview, TRUE);
+                       else {
+                               if (summaryview->displayed != summaryview->selected) {
+                                       summary_display_msg(summaryview,
+                                                           summaryview->selected);
+                                       break;
+                               }
+                               if (mod_pressed) {
+                                       if (!mimeview_scroll_page(messageview->mimeview, TRUE))
+                                               summary_select_prev_unread(summaryview);
+                               } else {
+                                       if (!mimeview_scroll_page(messageview->mimeview, FALSE))
+                                               summary_select_next_unread(summaryview);
+                               }                               
+                       }
+                       break;
+               case GDK_BackSpace:     /* Page up */
+                       handled = TRUE;
+                       mimeview_scroll_page(messageview->mimeview, TRUE);
+                       break;
+               case GDK_Return:        /* Scroll up/down one line */
+                       handled = TRUE;
+                       if (summaryview->displayed != summaryview->selected) {
+                               summary_display_msg(summaryview,
+                                                   summaryview->selected);
+                               break;
+                       }
+                       mimeview_scroll_one_line(messageview->mimeview, mod_pressed);
+                       break;
+               }
+               
+               if (handled)
+                       return FALSE;
+       }
+       if (summary_is_locked(summaryview)) 
+               return TRUE;
+
        switch (event->keyval) {
        case GDK_Left:          /* Move focus */
                adj = gtk_scrolled_window_get_hadjustment
@@ -5183,42 +5306,7 @@ static gboolean summary_key_pressed(GtkWidget *widget, GdkEventKey *event,
                        return TRUE;
        }
 
-       messageview = summaryview->messageview;
-       textview = messageview->mimeview->textview;
-
-       mod_pressed =
-               ((event->state & (GDK_SHIFT_MASK|GDK_MOD1_MASK)) != 0);
-
        switch (event->keyval) {
-       case GDK_space:         /* Page down or go to the next */
-               if (event->state & GDK_SHIFT_MASK) 
-                       mimeview_scroll_page(messageview->mimeview, TRUE);
-               else {
-                       if (summaryview->displayed != summaryview->selected) {
-                               summary_display_msg(summaryview,
-                                                   summaryview->selected);
-                               break;
-                       }
-                       if (mod_pressed) {
-                               if (!mimeview_scroll_page(messageview->mimeview, TRUE))
-                                       summary_select_prev_unread(summaryview);
-                       } else {
-                               if (!mimeview_scroll_page(messageview->mimeview, FALSE))
-                                       summary_select_next_unread(summaryview);
-                       }                               
-               }
-               break;
-       case GDK_BackSpace:     /* Page up */
-               mimeview_scroll_page(messageview->mimeview, TRUE);
-               break;
-       case GDK_Return:        /* Scroll up/down one line */
-               if (summaryview->displayed != summaryview->selected) {
-                       summary_display_msg(summaryview,
-                                           summaryview->selected);
-                       break;
-               }
-               mimeview_scroll_one_line(messageview->mimeview, mod_pressed);
-               break;
        case GDK_Delete:
                BREAK_ON_MODIFIER_KEY();
                summary_delete_trash(summaryview);
@@ -5315,6 +5403,23 @@ static void summary_selected(GtkCTree *ctree, GtkCTreeNode *row,
        MsgInfo *msginfo;
        gboolean marked_unread = FALSE;
 
+       if (summary_is_locked(summaryview)
+       && !GTK_SCTREE(ctree)->selecting_range
+       && summaryview->messageview->mimeview
+       && summaryview->messageview->mimeview->type == MIMEVIEW_TEXT
+       && summaryview->messageview->mimeview->textview->loading) {
+               PostponedSelectData *data = g_new0(PostponedSelectData, 1);
+               summaryview->messageview->mimeview->textview->stop_loading = TRUE;
+               
+               data->ctree = ctree;
+               data->row = row;
+               data->node = NULL;
+               data->column = column;
+               data->summaryview = summaryview;
+               debug_print("postponing open of message till end of load\n");
+               g_timeout_add(100, summary_select_retry, data);
+               return;
+       }
        if (summary_is_locked(summaryview)
        ||  GTK_SCTREE(ctree)->selecting_range) {
                return;
@@ -5854,13 +5959,13 @@ static void summary_ignore_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpoin
            msginfo->msgnum);
 }
 
-static void summary_ignore_thread(SummaryView *summaryview)
+void summary_ignore_thread(SummaryView *summaryview)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                gtk_ctree_pre_recursive(ctree, GTK_CTREE_NODE(cur->data), 
                                        GTK_CTREE_FUNC(summary_ignore_thread_func), 
@@ -5886,13 +5991,13 @@ static void summary_unignore_thread_func(GtkCTree *ctree, GtkCTreeNode *row, gpo
            msginfo->msgnum);
 }
 
-static void summary_unignore_thread(SummaryView *summaryview)
+void summary_unignore_thread(SummaryView *summaryview)
 {
        GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
        GList *cur;
        gboolean froze = FALSE;
 
-       START_LONG_OPERATION(summaryview);
+       START_LONG_OPERATION(summaryview, FALSE);
        for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
                gtk_ctree_pre_recursive(ctree, GTK_CTREE_NODE(cur->data), 
                                        GTK_CTREE_FUNC(summary_unignore_thread_func),