diff options
author | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-12-21 10:17:43 +0000 |
---|---|---|
committer | hiro <hiro@ee746299-78ed-0310-b773-934348b2243d> | 2005-12-21 10:17:43 +0000 |
commit | 99a8803e962701d0b9b43d0421cdc0bb05e8f02a (patch) | |
tree | 7ae8246cdd93921068bf453f9cd5c28b79a8bbd9 | |
parent | ace1046e570adceb22ce1ee924169b81676517d6 (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
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | ChangeLog.ja | 7 | ||||
-rw-r--r-- | libsylph/procmsg.c | 46 | ||||
-rw-r--r-- | libsylph/procmsg.h | 3 | ||||
-rw-r--r-- | src/compose.c | 6 | ||||
-rw-r--r-- | src/summaryview.c | 56 | ||||
-rw-r--r-- | src/summaryview.h | 2 |
7 files changed, 123 insertions, 4 deletions
@@ -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); |