gconstpointer ptr1,
gconstpointer ptr2);
+static void news_process_crossposted (MsgInfo *msginfo);
+static void news_flag_crosspost (MsgInfo *msginfo);
+
GtkTargetEntry summary_drag_types[1] =
{
{"text/plain", GTK_TARGET_SAME_APP, TARGET_DUMMY}
GtkWidget *scrolledwin;
GtkWidget *ctree;
GtkWidget *hbox;
+ GtkWidget *hbox_l;
GtkWidget *statlabel_folder;
GtkWidget *statlabel_select;
GtkWidget *statlabel_msgs;
+ GtkWidget *hbox_spc;
GtkWidget *toggle_view_btn;
GtkWidget *toggle_view_arrow;
GtkWidget *popupmenu;
hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_end(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+ hbox_l = gtk_hbox_new(FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(hbox), hbox_l, TRUE, TRUE, 0);
+
statlabel_folder = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(hbox), statlabel_folder, FALSE, FALSE, 2);
+ gtk_box_pack_start(GTK_BOX(hbox_l), statlabel_folder, FALSE, FALSE, 2);
statlabel_select = gtk_label_new("");
- gtk_box_pack_start(GTK_BOX(hbox), statlabel_select, FALSE, FALSE, 16);
+ gtk_box_pack_start(GTK_BOX(hbox_l), statlabel_select, FALSE, FALSE, 12);
/* toggle view buttons */
toggle_view_btn = gtk_button_new();
statlabel_msgs = gtk_label_new("");
gtk_box_pack_end(GTK_BOX(hbox), statlabel_msgs, FALSE, FALSE, 4);
+ hbox_spc = gtk_hbox_new(FALSE, 0);
+ gtk_box_pack_end(GTK_BOX(hbox), hbox_spc, FALSE, FALSE, 6);
+
/* create popup menu */
n_entries = sizeof(summary_popup_entries) /
sizeof(summary_popup_entries[0]);
summaryview->scrolledwin = scrolledwin;
summaryview->ctree = ctree;
summaryview->hbox = hbox;
+ summaryview->hbox_l = hbox_l;
summaryview->statlabel_folder = statlabel_folder;
summaryview->statlabel_select = statlabel_select;
summaryview->statlabel_msgs = statlabel_msgs;
gtk_widget_set_style(summaryview->statlabel_select, style);
gtk_widget_set_style(summaryview->statlabel_msgs, style);
- pixmap = stock_pixmap_widget(summaryview->hbox, STOCK_PIXMAP_DIR_OPEN);
- gtk_box_pack_start(GTK_BOX(summaryview->hbox), pixmap, FALSE, FALSE, 4);
- gtk_box_reorder_child(GTK_BOX(summaryview->hbox), pixmap, 0);
+ pixmap = stock_pixmap_widget(summaryview->hbox_l, STOCK_PIXMAP_DIR_OPEN);
+ gtk_box_pack_start(GTK_BOX(summaryview->hbox_l), pixmap, FALSE, FALSE, 4);
+ gtk_box_reorder_child(GTK_BOX(summaryview->hbox_l), pixmap, 0);
gtk_widget_show(pixmap);
summaryview->folder_pixmap = pixmap;
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);
return;
}
- if (summaryview->folder_item->folder->type != F_NEWS) {
+ if (summaryview->folder_item->folder->type != F_NEWS)
menu_set_sensitive(ifactory, "/Move...", TRUE);
- }
+ else
+ menu_set_sensitive(ifactory, "/Move...", FALSE);
+
menu_set_sensitive(ifactory, "/Delete", TRUE);
menu_set_sensitive(ifactory, "/Select thread", TRUE);
menu_set_sensitive(ifactory, "/Select all", TRUE);
summaryview->folder_item->stype == F_DRAFT ||
summaryview->folder_item->stype == F_QUEUE)
menu_set_sensitive(ifactory, "/Re-edit", sens);
+ else
+ menu_set_sensitive(ifactory, "/Re-edit", FALSE);
menu_set_sensitive(ifactory, "/Save as...", sens);
menu_set_sensitive(ifactory, "/Print...", TRUE);
msginfo = gtk_ctree_node_get_row_data(ctree, node);
+ if (MSG_IS_NEWS(msginfo->flags))
+ news_flag_crosspost(msginfo);
+
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))
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
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);
}
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)
procmsg_write_flags(msginfo, fps->mark_fp);
}
+static gchar *summary_complete_address(const gchar *addr)
+{
+ gint count;
+ gchar *res, *tmp, *email_addr;
+
+ Xstrdup_a(email_addr, addr, return NULL);
+ extract_address(email_addr);
+ g_return_val_if_fail(*email_addr, NULL);
+
+ /*
+ * completion stuff must be already initialized
+ */
+ res = NULL;
+ if (1 < (count = complete_address(email_addr))) {
+ tmp = get_complete_address(1);
+ res = procheader_get_fromname(tmp);
+ g_free(tmp);
+ }
+
+ return res;
+}
+
static void summary_set_header(SummaryView *summaryview, gchar *text[],
MsgInfo *msginfo)
{
_("(No From)");
if (prefs_common.swap_from && msginfo->from && msginfo->to &&
!MSG_IS_NEWS(msginfo->flags)) {
- gchar *from;
+ gchar *addr = NULL;
+
+ if (prefs_common.use_addr_book) {
+ Xstrdup_a(addr, msginfo->from, return);
+ extract_address(addr);
+ }
- Xstrdup_a(from, msginfo->from, return);
- extract_address(from);
- if (account_find_from_address(from)) {
+ if (account_find_from_address(addr)) {
+ addr = summary_complete_address(msginfo->to);
g_free(to);
- to = g_strconcat("-->", msginfo->to, NULL);
+ to = g_strconcat("-->", addr == NULL ? msginfo->to : addr, NULL);
text[col_pos[S_COL_FROM]] = to;
}
}
- if ((text[col_pos[S_COL_FROM]] != to) && prefs_common.use_addr_book &&
- msginfo->from) {
- gint count;
+ /*
+ * CLAWS: note that the "text[col_pos[S_COL_FROM]] != to" is really a hack,
+ * checking whether the above block (which handles the special case of
+ * the --> in sent boxes) was executed.
+ */
+ if (text[col_pos[S_COL_FROM]] != to && prefs_common.use_addr_book && msginfo->from) {
gchar *from;
-
- Xstrdup_a(from, msginfo->from, return);
- extract_address(from);
- if (*from) {
- count = complete_address(from);
- if (count > 1) {
- g_free(from_name);
- from = get_complete_address(1);
- from_name = procheader_get_fromname(from);
- g_free(from);
- text[col_pos[S_COL_FROM]] = from_name;
- }
- }
+ from = summary_complete_address(msginfo->from);
+ if (from) {
+ /*
+ * FIXME: this text[col_pos[S_COL_FROM]] should be freed
+ * but may have been assigned _("No From"). Should be
+ * freed???
+ */
+ text[col_pos[S_COL_FROM]] = from;
+ }
}
if (prefs->enable_simplify_subject
}
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;
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);
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);
}
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);
}
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)
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);
}
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 &&
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);
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;
}
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;
}
}
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);
}
summaryview->mlist = NULL;
}
- folderview_update_item(summaryview->folder_item, FALSE);
g_hash_table_destroy(summaryview->folder_table);
summaryview->folder_table = NULL;
}
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);
}
}
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,
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;
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;
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)
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));
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);
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
return MSG_GET_COLORLABEL(msginfo1->flags) -
MSG_GET_COLORLABEL(msginfo2->flags);
}
+
+static void news_flag_crosspost(MsgInfo *msginfo)
+{
+ GString *line;
+ gpointer key;
+ gpointer value;
+ MsgPermFlags flags;
+ Folder *mff = msginfo->folder->folder;
+
+ if (mff->account->mark_crosspost_read && MSG_IS_NEWS(msginfo->flags)) {
+ line = g_string_sized_new(128);
+ g_string_sprintf(line, "%s:%d", msginfo->folder->path, msginfo->msgnum);
+ debug_print(_("nfcp: checking <%s>"), line->str);
+ if (mff->newsart &&
+ g_hash_table_lookup_extended(mff->newsart, line->str, &key, &value)) {
+ debug_print(_(" <%s>"), value);
+ if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) {
+ MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_NEW | MSG_UNREAD);
+ MSG_SET_COLORLABEL_VALUE(msginfo->flags, mff->account->crosspost_col);
+ }
+ g_hash_table_remove(mff->newsart, key);
+ g_free(key);
+ }
+ g_string_free(line, TRUE);
+ debug_print(_("\n"));
+ }
+}
+
+static void news_process_crossposted(MsgInfo *msginfo)
+{
+ gchar **crossref;
+ gchar **crp;
+ gchar *cp;
+ gint cnt;
+ static char *read = "read";
+ Folder *mff = msginfo->folder->folder;
+
+ /* Get the Xref: line */
+ if (msginfo->xref) {
+ /* Retrieve the cross-posted groups and message ids */
+ /* Format of Xref is Xref: server message:id message:id ... */
+ crossref = g_strsplit(msginfo->xref, " ", 1024);
+ for (crp = crossref+2, cnt = 0; *crp; crp++, cnt++) {
+ if ((cp = strchr(*crp, ':'))) {
+ *cp = '\0';
+ if (!strcmp(*crp, msginfo->folder->path)) continue;
+ *cp = ':';
+
+ /* On first pass, create a GHashTable to hold the list of
+ * article numbers per newsgroup that have been read. */
+ if (!mff->newsart) {
+ mff->newsart = g_hash_table_new(g_str_hash, g_str_equal);
+ }
+ /* When a summary is selected, the articles for that
+ * newsgroup are marked based on this entry */
+ g_hash_table_insert(mff->newsart, g_strdup(*crp), read);
+ debug_print(_("Cross-reference %d: Hash <%s>\n"), cnt, *crp);
+ }
+ }
+ g_strfreev(crossref);
+ }
+}
+
static gint summary_cmp_by_score(GtkCList *clist,
gconstpointer ptr1, gconstpointer ptr2)
{
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"),
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);