aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--ChangeLog.ja7
-rw-r--r--libsylph/procmsg.c46
-rw-r--r--libsylph/procmsg.h3
-rw-r--r--src/compose.c6
-rw-r--r--src/summaryview.c56
-rw-r--r--src/summaryview.h2
7 files changed, 123 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 96726349..4d285c0b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
2005-12-21
+ * libsylph/procmsg.[ch]
+ src/compose.c
+ src/summaryview.[ch]: reflect flag changes on virtual folders in the
+ real ones.
+
+2005-12-21
+
* libsylph/virtual.c
libsylph/filter.c
src/summary_search.c
diff --git a/ChangeLog.ja b/ChangeLog.ja
index 0b520361..7bc5a8d1 100644
--- a/ChangeLog.ja
+++ b/ChangeLog.ja
@@ -1,5 +1,12 @@
2005-12-21
+ * libsylph/procmsg.[ch]
+ src/compose.c
+ src/summaryview.[ch]: 仮想フォルダでのフラグ変更が実際のフォルダに
+ 反映されるようにした。
+
+2005-12-21
+
* libsylph/virtual.c
libsylph/filter.c
src/summary_search.c
diff --git a/libsylph/procmsg.c b/libsylph/procmsg.c
index e93774ba..c2dd50a0 100644
--- a/libsylph/procmsg.c
+++ b/libsylph/procmsg.c
@@ -536,6 +536,52 @@ void procmsg_write_flags_list(FolderItem *item, GSList *mlist)
item->mark_dirty = FALSE;
}
+static gint cmp_by_item(gconstpointer a, gconstpointer b)
+{
+ const MsgInfo *msginfo1 = a;
+ const MsgInfo *msginfo2 = b;
+
+ if (msginfo1->folder == msginfo2->folder)
+ return msginfo1->msgnum - msginfo2->msgnum;
+
+ return msginfo1->folder - msginfo2->folder;
+}
+
+void procmsg_write_flags_for_multiple_folders(GSList *mlist)
+{
+ GSList *tmp_list, *cur;
+ FolderItem *prev_item = NULL;
+ FILE *fp = NULL;
+
+ if (!mlist)
+ return;
+
+ tmp_list = g_slist_copy(mlist);
+ tmp_list = g_slist_sort(tmp_list, cmp_by_item);
+
+ for (cur = tmp_list; cur != NULL; cur = cur->next) {
+ MsgInfo *msginfo = (MsgInfo *)cur->data;
+ FolderItem *item = msginfo->folder;
+
+ if (prev_item != item) {
+ if (fp)
+ fclose(fp);
+ fp = procmsg_open_mark_file(item, DATA_APPEND);
+ if (!fp) {
+ g_warning("can't open mark file\n");
+ break;
+ }
+ item->updated = TRUE;
+ }
+ procmsg_write_flags(msginfo, fp);
+ prev_item = item;
+ }
+
+ if (fp)
+ fclose(fp);
+ g_slist_free(tmp_list);
+}
+
void procmsg_flush_mark_queue(FolderItem *item, FILE *fp)
{
MsgInfo *flaginfo;
diff --git a/libsylph/procmsg.h b/libsylph/procmsg.h
index c8a3ba16..0e7e1b10 100644
--- a/libsylph/procmsg.h
+++ b/libsylph/procmsg.h
@@ -130,6 +130,7 @@ typedef guint32 MsgTmpFlags;
#define MSG_IS_IMAP(msg) (((msg).tmp_flags & MSG_IMAP) != 0)
#define MSG_IS_NEWS(msg) (((msg).tmp_flags & MSG_NEWS) != 0)
#define MSG_IS_SIGNED(msg) (((msg).tmp_flags & MSG_SIGNED) != 0)
+#define MSG_IS_FLAG_CHANGED(msg) (((msg).tmp_flags & MSG_FLAG_CHANGED) != 0)
#define MSG_IS_CACHED(msg) (((msg).tmp_flags & MSG_CACHED) != 0)
#define MSG_IS_MIME(msg) (((msg).tmp_flags & MSG_MIME) != 0)
#define MSG_IS_INVALID(msg) (((msg).tmp_flags & MSG_INVALID) != 0)
@@ -231,6 +232,8 @@ void procmsg_write_cache_list (FolderItem *item,
GSList *mlist);
void procmsg_write_flags_list (FolderItem *item,
GSList *mlist);
+void procmsg_write_flags_for_multiple_folders
+ (GSList *mlist);
void procmsg_flush_mark_queue (FolderItem *item,
FILE *fp);
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);