N_("L") /* S_COL_LOCKED */
};
+#define START_LONG_OPERATION(summaryview) { \
+ summary_lock(summaryview); \
+ main_window_cursor_wait(summaryview->mainwin); \
+ gtk_clist_freeze(GTK_CLIST(summaryview->ctree)); \
+ folder_item_update_freeze(); \
+ inc_lock(); \
+}
+#define END_LONG_OPERATION(summaryview) { \
+ inc_unlock(); \
+ folder_item_update_thaw(); \
+ gtk_clist_thaw(GTK_CLIST(summaryview->ctree)); \
+ main_window_cursor_normal(summaryview->mainwin); \
+ summary_unlock(summaryview); \
+}
+
SummaryView *summary_create(void)
{
SummaryView *summaryview;
summary_set_hide_read_msgs_menu(summaryview, TRUE);
not_killed = NULL;
- for(cur = mlist ; cur != NULL ; cur = g_slist_next(cur)) {
+ for(cur = mlist ; cur != NULL && cur->data != NULL ; cur = g_slist_next(cur)) {
MsgInfo * msginfo = (MsgInfo *) cur->data;
if ((MSG_IS_UNREAD(msginfo->flags)
GSList *not_killed;
not_killed = NULL;
- for (cur = mlist ; cur != NULL ; cur = g_slist_next(cur)) {
+ for (cur = mlist ; cur != NULL && cur->data != NULL ; cur = g_slist_next(cur)) {
MsgInfo * msginfo = (MsgInfo *) cur->data;
if (quicksearch_match(summaryview->quicksearch, msginfo))
kill_score = prefs_common.kill_score;
if (item->prefs->kill_score > kill_score)
kill_score = item->prefs->kill_score;
- for(cur = mlist ; cur != NULL ; cur = g_slist_next(cur)) {
+ for(cur = mlist ; cur != NULL && cur->data != NULL ; cur = g_slist_next(cur)) {
MsgInfo * msginfo = (MsgInfo *) cur->data;
if (msginfo->score > kill_score)
}
#endif
not_killed = NULL;
- for(cur = mlist ; cur != NULL ; cur = g_slist_next(cur)) {
+ for(cur = mlist ; cur != NULL && cur->data != NULL ; cur = g_slist_next(cur)) {
MsgInfo * msginfo = (MsgInfo *) cur->data;
if (!msginfo->hidden)
displayed_msgnum);
if (!summaryview->displayed)
messageview_clear(summaryview->messageview);
+ summary_unlock(summaryview);
summary_select_by_msgnum(summaryview, selected_msgnum);
+ summary_lock(summaryview);
if (!summaryview->selected) {
/* no selected message - select first unread
message, but do not display it */
(ctree,
item->sort_type == SORT_DESCENDING
? 0 : GTK_CLIST(ctree)->rows - 1);
+ summary_unlock(summaryview);
summary_select_node(summaryview, node, FALSE, TRUE);
+ summary_lock(summaryview);
}
} else {
/* select first unread message */
-#if 0
- if (summaryview->sort_key == SORT_BY_SCORE)
- node = summary_find_next_important_score(summaryview,
- NULL);
- else
-#endif
node = summary_find_next_flagged_msg(summaryview, NULL,
MSG_UNREAD, FALSE);
if (node == NULL && GTK_CLIST(ctree)->row_list != NULL) {
messageview_is_visible(summaryview->messageview),
TRUE);
summary_lock(summaryview);
- } else
+ } else {
summary_select_node(summaryview, node, FALSE, TRUE);
+ }
}
summary_set_column_titles(summaryview);
GList *cur;
MsgInfo *msginfo;
- for (cur = GTK_CLIST(summaryview->ctree)->selection; cur != NULL;
+ for (cur = GTK_CLIST(summaryview->ctree)->selection; cur != NULL && cur->data != NULL;
cur = cur->next) {
msginfo = GTKUT_CTREE_NODE_GET_ROW_DATA(cur->data);
mlist = g_slist_prepend(mlist, msginfo);
if (summaryview->displayed
&& summaryview->selected == summaryview->displayed) {
- debug_print("skipping cur\n");
+ debug_print("skipping cur (%p %p)\n",
+ summaryview->displayed, summaryview->selected);
skip_cur = TRUE;
}
summaryview->displayed = NULL;
summaryview->display_msg = display_msg;
gtk_sctree_select(GTK_SCTREE(ctree), node);
+ if (summaryview->selected == NULL)
+ summaryview->selected = node;
}
}
}
rowlist = GTK_CLIST(summaryview->ctree)->selection;
- for (cur = rowlist; cur != NULL; cur = cur->next) {
+ for (cur = rowlist; cur != NULL && cur->data != NULL; cur = cur->next) {
msginfo = gtk_ctree_node_get_row_data
(GTK_CTREE(summaryview->ctree),
GTK_CTREE_NODE(cur->data));
if (prefs_common.use_addr_book)
start_address_completion();
- for (cur = mlist ; cur != NULL; cur = cur->next) {
+ for (cur = mlist ; cur != NULL && cur->data != NULL; cur = cur->next) {
msginfo = (MsgInfo *)cur->data;
msginfo->threadscore = msginfo->score;
}
void summary_set_marks_selected(SummaryView *summaryview)
{
GList *cur;
-
- for (cur = GTK_CLIST(summaryview->ctree)->selection; cur != NULL;
+ summary_lock(summaryview);
+ for (cur = GTK_CLIST(summaryview->ctree)->selection; cur != NULL && cur->data != NULL;
cur = cur->next)
summary_set_row_marks(summaryview, GTK_CTREE_NODE(cur->data));
+ summary_unlock(summaryview);
}
static void summary_mark_row(SummaryView *summaryview, GtkCTreeNode *row)
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
GList *cur;
- folder_item_update_freeze();
- gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+ START_LONG_OPERATION(summaryview);
+ 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));
- folder_item_update_thaw();
- gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+ folder_item_set_batch(summaryview->folder_item, FALSE);
+ END_LONG_OPERATION(summaryview);
- /* summary_step(summaryview, GTK_SCROLL_STEP_FORWARD); */
summary_status_show(summaryview);
}
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
GList *cur;
- folder_item_update_freeze();
- gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+ START_LONG_OPERATION(summaryview);
+ 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,
GTK_CTREE_NODE(cur->data));
- folder_item_update_thaw();
- gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
-
+ folder_item_set_batch(summaryview->folder_item, FALSE);
+ END_LONG_OPERATION(summaryview);
+
summary_status_show(summaryview);
}
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
GList *cur;
- folder_item_update_freeze();
- gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+ START_LONG_OPERATION(summaryview);
+ for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
summary_lock_row(summaryview,
GTK_CTREE_NODE(cur->data));
- folder_item_update_thaw();
- gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+ END_LONG_OPERATION(summaryview);
summary_status_show(summaryview);
}
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
GList *cur;
- folder_item_update_freeze();
- gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+ START_LONG_OPERATION(summaryview);
+ for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next)
summary_unlock_row(summaryview,
GTK_CTREE_NODE(cur->data));
- folder_item_update_thaw();
- gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+ END_LONG_OPERATION(summaryview);
summary_status_show(summaryview);
}
void summary_mark_all_read(SummaryView *summaryview)
{
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
- GtkCList *clist = GTK_CLIST(summaryview->ctree);
GtkCTreeNode *node;
- gtk_clist_freeze(clist);
- folder_item_update_freeze();
+ START_LONG_OPERATION(summaryview);
+ 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))
summary_mark_row_as_read(summaryview, node);
+ folder_item_set_batch(summaryview->folder_item, FALSE);
for (node = GTK_CTREE_NODE(GTK_CLIST(ctree)->row_list); node != NULL;
node = gtkut_ctree_node_next(ctree, node)) {
if (!GTK_CTREE_ROW(node)->expanded)
summary_set_row_marks(summaryview, node);
}
- folder_item_update_thaw();
- gtk_clist_thaw(clist);
-
+ END_LONG_OPERATION(summaryview);
+
summary_status_show(summaryview);
}
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
GList *cur;
- folder_item_update_freeze();
- gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+ START_LONG_OPERATION(summaryview);
+ 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_unread(summaryview,
GTK_CTREE_NODE(cur->data));
- folder_item_update_thaw();
- gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+ folder_item_set_batch(summaryview->folder_item, FALSE);
+ END_LONG_OPERATION(summaryview);
summary_status_show(summaryview);
}
GTK_STOCK_YES, GTK_STOCK_NO, NULL);
if (aval != G_ALERTDEFAULT) return;
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next) {
+ for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL;
+ cur = cur->next) {
GtkCTreeNode *row = GTK_CTREE_NODE(cur->data);
msginfo = gtk_ctree_node_get_row_data(ctree, row);
- partial_mark_for_delete(msginfo);
+ if (msginfo->total_size != 0 &&
+ msginfo->size != (off_t)msginfo->total_size)
+ partial_mark_for_delete(msginfo);
}
}
/* next code sets current row focus right. We need to find a row
* that is not deleted. */
+ summary_lock(summaryview);
folder_item_update_freeze();
gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next) {
+ for (cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next) {
sel_last = GTK_CTREE_NODE(cur->data);
summary_delete_row(summaryview, sel_last);
}
folder_item_update_thaw();
gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+ summary_unlock(summaryview);
node = summary_find_next_msg(summaryview, sel_last);
if (!node)
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
GList *cur;
- folder_item_update_freeze();
- gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
-
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+ START_LONG_OPERATION(summaryview);
+ 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));
-
- folder_item_update_thaw();
- gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
-
+ folder_item_set_batch(summaryview->folder_item, FALSE);
+ END_LONG_OPERATION(summaryview);
+
summary_status_show(summaryview);
}
return;
}
- folder_item_update_freeze();
- gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
+ START_LONG_OPERATION(summaryview);
for (cur = GTK_CLIST(summaryview->ctree)->selection;
- cur != NULL; cur = cur->next)
+ cur != NULL && cur->data != NULL; cur = cur->next)
summary_move_row_to
(summaryview, GTK_CTREE_NODE(cur->data), to_folder);
- folder_item_update_thaw();
- gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+ END_LONG_OPERATION(summaryview);
summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
return;
}
- folder_item_update_freeze();
- gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
+ START_LONG_OPERATION(summaryview);
for (cur = GTK_CLIST(summaryview->ctree)->selection;
- cur != NULL; cur = cur->next)
+ cur != NULL && cur->data != NULL; cur = cur->next)
summary_copy_row_to
(summaryview, GTK_CTREE_NODE(cur->data), to_folder);
- folder_item_update_thaw();
- gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+ END_LONG_OPERATION(summaryview);
summary_step(summaryview, GTK_SCROLL_STEP_FORWARD);
return;
}
- for (cur = clist->selection; cur != NULL; cur = cur->next) {
+ for (cur = clist->selection; cur != NULL && cur->data != NULL; cur = cur->next) {
msginfo = gtk_ctree_node_get_row_data
(ctree, GTK_CTREE_NODE(cur->data));
if (msginfo) procmsg_print_message(msginfo, cmdline);
if (summaryview->mlist) {
procmsg_move_messages(summaryview->mlist);
- for (cur = summaryview->mlist; cur != NULL; cur = cur->next)
+ for (cur = summaryview->mlist; cur != NULL && cur->data != NULL; cur = cur->next)
procmsg_msginfo_free((MsgInfo *)cur->data);
g_slist_free(summaryview->mlist);
summaryview->mlist = NULL;
else
folder_item_move_msgs(trash, summaryview->mlist);
- for (cur = summaryview->mlist; cur != NULL; cur = cur->next)
+ for (cur = summaryview->mlist; cur != NULL && cur->data != NULL; cur = cur->next)
procmsg_msginfo_free((MsgInfo *)cur->data);
g_slist_free(summaryview->mlist);
GList *cur;
for (cur = GTK_CLIST(summaryview->ctree)->selection;
- cur != NULL; cur = cur->next) {
+ cur != NULL && cur->data != NULL; cur = cur->next) {
summary_filter_func(GTK_CTREE(summaryview->ctree),
GTK_CTREE_NODE(cur->data),
summaryview);
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
GList *cur;
- main_window_cursor_wait(summaryview->mainwin);
- folder_item_update_freeze();
- gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+ START_LONG_OPERATION(summaryview);
+
+ 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);
- folder_item_update_thaw();
- gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
- main_window_cursor_normal(summaryview->mainwin);
+ END_LONG_OPERATION(summaryview);
}
static void summary_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menu_item,
GINT_TO_POINTER(1));
/* clear items. get item pointers. */
- for (n = 0, cur = menu->children; cur != NULL; cur = cur->next) {
+ for (n = 0, cur = menu->children; cur != NULL && cur->data != NULL; cur = cur->next) {
if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
gtk_check_menu_item_set_active
(GTK_CHECK_MENU_ITEM(cur->data), FALSE);
summary_show(summaryview, item);
summary_select_by_msgnum(summaryview, selected_msgnum);
+
summaryview->displayed = summary_find_msg_by_msgnum(summaryview, displayed_msgnum);
if (!summaryview->displayed)
messageview_clear(summaryview->messageview);
MsgInfo *msginfo;
gboolean marked_unread = FALSE;
+ if (summary_is_locked(summaryview))
+ return;
+
if (column == -1 && GTK_CLIST(ctree)->selection
&& GTK_CLIST(ctree)->selection->next) {
/* multiple selection */
static void summary_show_all_header_cb(SummaryView *summaryview,
guint action, GtkWidget *widget)
{
+ summaryview->messageview->all_headers =
+ GTK_CHECK_MENU_ITEM(widget)->active;
summary_display_msg_selected(summaryview,
GTK_CHECK_MENU_ITEM(widget)->active);
}
gchar *mail_list = NULL, *tmp1, *tmp2;
for (cur = GTK_CLIST(ctree)->selection;
- cur != NULL; cur = cur->next) {
+ cur != NULL && cur->data != NULL; cur = cur->next) {
msginfo = gtk_ctree_node_get_row_data
(ctree, GTK_CTREE_NODE(cur->data));
tmp2 = procmsg_get_message_file(msginfo);
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
GList *cur;
- folder_item_update_freeze();
- gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+ START_LONG_OPERATION(summaryview);
+ 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),
summaryview);
- folder_item_update_thaw();
- gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
-
+ END_LONG_OPERATION(summaryview);
+
summary_status_show(summaryview);
}
GtkCTree *ctree = GTK_CTREE(summaryview->ctree);
GList *cur;
- folder_item_update_freeze();
- gtk_clist_freeze(GTK_CLIST(summaryview->ctree));
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+ START_LONG_OPERATION(summaryview);
+ 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),
summaryview);
- folder_item_update_thaw();
- gtk_clist_thaw(GTK_CLIST(summaryview->ctree));
+ END_LONG_OPERATION(summaryview);
+
summary_status_show(summaryview);
}
GList *cur;
gint found_ignore = 0;
- for (cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next)
+ 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_check_ignore_thread_func),
&found_ignore);
TRUE);
*/
mlist = folder_item_get_msg_list(item);
- for(cur = mlist ; cur != NULL ; cur = cur->next) {
+ for(cur = mlist ; cur != NULL && cur->data != NULL ; cur = cur->next) {
MsgInfo * msginfo;
msginfo = (MsgInfo *) cur->data;
{
GList * cur;
- for (cur = folder_get_list() ; cur != NULL ; cur = g_list_next(cur)) {
+ for (cur = folder_get_list() ; cur != NULL && cur->data != NULL ; cur = g_list_next(cur)) {
Folder *folder;
folder = (Folder *) cur->data;
MsgInfo *msginfo;
msgList = NULL;
- for( cur = GTK_CLIST(ctree)->selection; cur != NULL; cur = cur->next ) {
+ for( cur = GTK_CLIST(ctree)->selection; cur != NULL && cur->data != NULL; cur = cur->next ) {
msginfo = gtk_ctree_node_get_row_data( ctree, GTK_CTREE_NODE(cur->data) );
msgList = g_list_append( msgList, GUINT_TO_POINTER( msginfo->msgnum ) );
}
g_free(mbox);
}
+
+void summaryview_lock(SummaryView *summaryview, FolderItem *item)
+{
+ if (!summaryview || !summaryview->folder_item || !item) {
+ return;
+ }
+
+ if (summaryview->folder_item->folder == item->folder) {
+ gtk_widget_set_sensitive(summaryview->ctree, FALSE);
+ }
+}
+void summaryview_unlock(SummaryView *summaryview, FolderItem *item)
+{
+ gtk_widget_set_sensitive(summaryview->ctree, TRUE);
+}