aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-12-21 10:17:43 +0000
committerhiro <hiro@ee746299-78ed-0310-b773-934348b2243d>2005-12-21 10:17:43 +0000
commit99a8803e962701d0b9b43d0421cdc0bb05e8f02a (patch)
tree7ae8246cdd93921068bf453f9cd5c28b79a8bbd9 /src
parentace1046e570adceb22ce1ee924169b81676517d6 (diff)
reflect flag changes on virtual folders in the real ones.
git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@850 ee746299-78ed-0310-b773-934348b2243d
Diffstat (limited to 'src')
-rw-r--r--src/compose.c6
-rw-r--r--src/summaryview.c56
-rw-r--r--src/summaryview.h2
3 files changed, 60 insertions, 4 deletions
diff --git a/src/compose.c b/src/compose.c
index b1d12dcc..2e77a6df 100644
--- a/src/compose.c
+++ b/src/compose.c
@@ -769,7 +769,8 @@ void compose_reply(MsgInfo *msginfo, FolderItem *item, ComposeMode mode,
MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_FORWARDED);
MSG_SET_PERM_FLAGS(msginfo->flags, MSG_REPLIED);
MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED);
- msginfo->folder->mark_dirty = TRUE;
+ if (item)
+ item->mark_dirty = TRUE;
if (MSG_IS_IMAP(msginfo->flags))
imap_msg_set_perm_flags(msginfo, MSG_REPLIED);
@@ -861,7 +862,8 @@ void compose_forward(GSList *mlist, FolderItem *item, gboolean as_attach,
MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_REPLIED);
MSG_SET_PERM_FLAGS(msginfo->flags, MSG_FORWARDED);
MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED);
- msginfo->folder->mark_dirty = TRUE;
+ if (item)
+ item->mark_dirty = TRUE;
}
msginfo = (MsgInfo *)mlist->data;
if (MSG_IS_IMAP(msginfo->flags))
diff --git a/src/summaryview.c b/src/summaryview.c
index 39940ce1..eb11dc92 100644
--- a/src/summaryview.c
+++ b/src/summaryview.c
@@ -918,7 +918,6 @@ GSList *summary_get_selected_msg_list(SummaryView *summaryview)
rows = summary_get_selected_rows(summaryview);
for (cur = rows; cur != NULL; cur = cur->next) {
- msginfo = NULL;
gtk_tree_model_get_iter(model, &iter, (GtkTreePath *)cur->data);
gtk_tree_model_get(model, &iter, S_COL_MSG_INFO, &msginfo, -1);
mlist = g_slist_prepend(mlist, msginfo);
@@ -929,6 +928,26 @@ GSList *summary_get_selected_msg_list(SummaryView *summaryview)
return mlist;
}
+GSList *summary_get_changed_msg_list(SummaryView *summaryview)
+{
+ GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store);
+ GtkTreeIter iter;
+ GSList *mlist = NULL;
+ MsgInfo *msginfo;
+ gboolean valid;
+
+ valid = gtk_tree_model_get_iter_first(model, &iter);
+
+ while (valid) {
+ gtk_tree_model_get(model, &iter, S_COL_MSG_INFO, &msginfo, -1);
+ if (MSG_IS_FLAG_CHANGED(msginfo->flags))
+ mlist = g_slist_prepend(mlist, msginfo);
+ valid = gtkut_tree_model_next(model, &iter);
+ }
+
+ return g_slist_reverse(mlist);
+}
+
GSList *summary_get_msg_list(SummaryView *summaryview)
{
GtkTreeModel *model = GTK_TREE_MODEL(summaryview->store);
@@ -2142,7 +2161,7 @@ gint summary_write_cache(SummaryView *summaryview)
} else
fps.cache_fp = NULL;
- if (item->mark_dirty) {
+ if (item->mark_dirty && item->stype != F_VIRTUAL) {
fps.mark_fp = procmsg_open_mark_file(item, DATA_WRITE);
if (fps.mark_fp == NULL) {
if (fps.cache_fp)
@@ -2174,6 +2193,17 @@ gint summary_write_cache(SummaryView *summaryview)
if (fps.mark_fp)
fclose(fps.mark_fp);
+ if (item->stype == F_VIRTUAL) {
+ GSList *mlist;
+
+ mlist = summary_get_changed_msg_list(summaryview);
+ if (mlist) {
+ procmsg_write_flags_for_multiple_folders(mlist);
+ g_slist_free(mlist);
+ folderview_update_all_updated(FALSE);
+ }
+ }
+
debug_print(_("done.\n"));
if (item->cache_dirty) {
@@ -2267,6 +2297,15 @@ static void summary_display_msg_full(SummaryView *summaryview,
summaryview->folder_item->new--;
if (MSG_IS_UNREAD(msginfo->flags))
summaryview->folder_item->unread--;
+
+ if (summaryview->folder_item->stype == F_VIRTUAL) {
+ if (MSG_IS_NEW(msginfo->flags))
+ msginfo->folder->new--;
+ if (MSG_IS_UNREAD(msginfo->flags))
+ msginfo->folder->unread--;
+ folderview_update_item(msginfo->folder, FALSE);
+ }
+
if (MSG_IS_NEW(msginfo->flags) ||
MSG_IS_UNREAD(msginfo->flags)) {
MSG_UNSET_PERM_FLAGS
@@ -2509,6 +2548,15 @@ static void summary_mark_row_as_read(SummaryView *summaryview,
summaryview->folder_item->new--;
if (MSG_IS_UNREAD(msginfo->flags))
summaryview->folder_item->unread--;
+
+ if (summaryview->folder_item->stype == F_VIRTUAL) {
+ if (MSG_IS_NEW(msginfo->flags))
+ msginfo->folder->new--;
+ if (MSG_IS_UNREAD(msginfo->flags))
+ msginfo->folder->unread--;
+ folderview_update_item(msginfo->folder, FALSE);
+ }
+
if (MSG_IS_NEW(msginfo->flags) || MSG_IS_UNREAD(msginfo->flags)) {
MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_NEW | MSG_UNREAD);
MSG_SET_TMP_FLAGS(msginfo->flags, MSG_FLAG_CHANGED);
@@ -2598,6 +2646,10 @@ static void summary_mark_row_as_unread(SummaryView *summaryview,
MSG_SET_PERM_FLAGS(msginfo->flags, MSG_UNREAD);
summaryview->folder_item->unread++;
summaryview->folder_item->mark_dirty = TRUE;
+ if (summaryview->folder_item->stype == F_VIRTUAL) {
+ msginfo->folder->unread++;
+ folderview_update_item(msginfo->folder, FALSE);
+ }
debug_print(_("Message %d is marked as unread\n"),
msginfo->msgnum);
}
diff --git a/src/summaryview.h b/src/summaryview.h
index f5267629..d2688d89 100644
--- a/src/summaryview.h
+++ b/src/summaryview.h
@@ -152,6 +152,8 @@ gboolean summary_is_locked (SummaryView *summaryview);
SummarySelection summary_get_selection_type (SummaryView *summaryview);
GSList *summary_get_selected_msg_list (SummaryView *summaryview);
+GSList *summary_get_changed_msg_list (SummaryView *summaryview);
+GSList *summary_get_msg_list (SummaryView *summaryview);
void summary_select_prev_unread (SummaryView *summaryview);
void summary_select_next_unread (SummaryView *summaryview);