0.9.4claws64
authorChristoph Hohmann <reboot@gmx.ch>
Fri, 5 Sep 2003 21:07:17 +0000 (21:07 +0000)
committerChristoph Hohmann <reboot@gmx.ch>
Fri, 5 Sep 2003 21:07:17 +0000 (21:07 +0000)
* src/folder.c
* src/messageview.[ch]
* src/procmsg.[ch]
* src/summaryview.c
        extend MSGINFO_UPDATE_HOOK to send delete notifications. Used
        by MessageView to clear it when the message is deleted. Should
        work even if messages are deleted in MainWindow or by
        processing.

ChangeLog.claws
configure.ac
src/folder.c
src/messageview.c
src/messageview.h
src/procmsg.c
src/procmsg.h
src/summaryview.c

index ed53f53cbfca97d5e0edeb949517c0d3cc6cf363..e97b968a8006253e1d144c05a82ac9a9bb545f19 100644 (file)
@@ -1,3 +1,14 @@
+2003-09-03 [christoph] 0.9.4claws64
+
+       * src/folder.c
+       * src/messageview.[ch]
+       * src/procmsg.[ch]
+       * src/summaryview.c
+               extend MSGINFO_UPDATE_HOOK to send delete notifications. Used
+               by MessageView to clear it when the message is deleted. Should
+               work even if messages are deleted in MainWindow or by
+               processing.
+
 2003-09-03 [alfons]    0.9.4claws63
 
        * src/messageview.c
index ab2ee6293e67622303b59b8a717baa1bc10d592c..d9a1daf649ea713c48ae75d2d1123ce10a97f82a 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=9
 MICRO_VERSION=4
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=63
+EXTRA_VERSION=64
 if test $EXTRA_VERSION -eq 0; then
     VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}claws
 else
index 38fd83fbf39ad8758488b6182055c62fd3683b7b..01ff936afc01f7e49c439df76a0512a896f8a4eb 100644 (file)
@@ -1671,6 +1671,8 @@ static void add_msginfo_to_cache(FolderItem *item, MsgInfo *newmsginfo, MsgInfo
 
 static void remove_msginfo_from_cache(FolderItem *item, MsgInfo *msginfo)
 {
+       MsgInfoUpdate msginfo_update;
+
        if (!item->cache)
                folder_item_read_cache(item);
 
@@ -1682,6 +1684,10 @@ static void remove_msginfo_from_cache(FolderItem *item, MsgInfo *msginfo)
                msginfo->folder->unreadmarked_msgs--;
        msginfo->folder->total_msgs--;
 
+       msginfo_update.msginfo = msginfo;
+       msginfo_update.flags = MSGINFO_UPDATE_DELETED;
+       hooks_invoke(MSGINFO_UPDATE_HOOKLIST, &msginfo_update);
+
        msgcache_remove_msg(item->cache, msginfo->msgnum);
        folder_item_update(msginfo->folder, F_ITEM_UPDATE_MSGCNT | F_ITEM_UPDATE_CONTENT);
 }
index 11fead480da0f67c89dae6ed4fdccfc4d0b9b478..495efc605de17f0cd490c9cafa07fd6d1423e546 100644 (file)
@@ -60,6 +60,7 @@
 #include "rfc2015.h"
 #include "send_message.h"
 #include "stock_pixmap.h"
+#include "hooks.h"
 
 static GList *messageview_list = NULL;
 
@@ -128,14 +129,11 @@ static void create_filter_cb              (gpointer        data,
                                         guint           action,
                                         GtkWidget      *widget);
 
-static void messageview_menubar_cb     (MessageView    *msgview,
-                                        guint           action, 
-                                        GtkWidget      *widget);
 static void about_cb                   (gpointer        data,
                                         guint           action,
                                         GtkWidget      *widget);
 static void messageview_update         (MessageView *msgview);
-static void messageview_update_all     (MessageView *msgview);
+static gboolean messageview_update_msg (gpointer source, gpointer data);
 
 static GList *msgview_list = NULL;
 static GtkItemFactoryEntry msgview_entries[] =
@@ -328,6 +326,8 @@ MessageView *messageview_create(MainWindow *mainwin)
        messageview->mimeview   = mimeview;
        messageview->noticeview = noticeview;
        messageview->mainwin    = mainwin;
+       messageview->msginfo_update_callback_id =
+               hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, messageview_update_msg, (gpointer) messageview);
 
        return messageview;
 }
@@ -736,6 +736,9 @@ void messageview_destroy(MessageView *messageview)
        debug_print("destroy messageview\n");
        messageview_list = g_list_remove(messageview_list, messageview);
 
+       hooks_unregister_hook(MSGINFO_UPDATE_HOOKLIST,
+                             messageview->msginfo_update_callback_id);
+
        headerview_destroy(messageview->headerview);
        textview_destroy(messageview->textview);
        mimeview_destroy(messageview->mimeview);
@@ -758,60 +761,19 @@ void messageview_destroy(MessageView *messageview)
 
 void messageview_delete(MessageView *msgview)
 {
-       MsgInfo *msginfo = (MsgInfo*)msgview->msginfo;
+       MsgInfo *msginfo = (MsgInfo *) msgview->msginfo;
        FolderItem *trash = folder_get_default_trash();
-       GSList *msg_list;
 
        g_return_if_fail(msginfo != NULL);
        g_return_if_fail(trash   != NULL);
-       
-       msg_list = folder_item_get_msg_list(msginfo->folder);
-       
-       if (msg_list == NULL) {
-               alertpanel_error(_("Message already removed from folder."));
-               return;
-       }
-       
-       for (; msg_list != NULL; msg_list = msg_list->next) {
-               MsgInfo *msginfo_list = (MsgInfo*)msg_list->data;
-               
-               if (msginfo->msgnum == msginfo_list->msgnum) {
-
-                       if (prefs_common.immediate_exec)
-                               folder_item_move_msg(trash, msginfo);
-                       else {
-                               procmsg_msginfo_set_to_folder(msginfo, trash);
-                               procmsg_msginfo_set_flags(msginfo, MSG_DELETED, 0);
-                               /* NOTE: does not update to next message in summaryview
-                                */
-                       }
-                               
-                       messageview_update_all(msgview);
-                       break;
-               }
-       }
-}
 
-/*     
- * scan List of MessageViews checking whether there are any Views holding messages 
- * which need to be updated (another view might have deleted the one this MessagView holds)
- */
-static void messageview_update_all(MessageView *msgview)
-{
-       MsgInfo *msginfo = (MsgInfo*)msgview->msginfo;
-       GList *cur;
-       
-       g_return_if_fail(msginfo != NULL);
-
-       for (cur = msgview_list; cur != NULL; cur = cur->next) {
-               MessageView *msgview = (MessageView*)cur->data;
-               MsgInfo *msginfo_list = (MsgInfo*)msgview->msginfo;
-               
-               g_return_if_fail(msginfo != NULL);
-               g_return_if_fail(msginfo_list);
-
-               if (msginfo->msgnum == msginfo_list->msgnum)
-                       messageview_update(msgview);
+       if (prefs_common.immediate_exec)
+               /* TODO: Delete from trash */
+               folder_item_move_msg(trash, msginfo);
+       else {
+               procmsg_msginfo_set_to_folder(msginfo, trash);
+               procmsg_msginfo_set_flags(msginfo, MSG_DELETED, 0);
+               /* NOTE: does not update to next message in summaryview */
        }
 }
 
@@ -1110,31 +1072,6 @@ gchar *messageview_get_selection(MessageView *msgview)
        return text;
 }
 
-static void messageview_delete_cb(MessageView *msgview, guint action, GtkWidget *widget)
-{
-       messageview_delete(msgview);
-}
-
-static void messageview_menubar_cb(MessageView *msgview, guint action, GtkWidget *widget)
-{
-       GSList *msginfo_list = NULL;
-       gchar *body;
-       MsgInfo *msginfo;
-
-       g_return_if_fail(msgview != NULL);
-
-       msginfo = (MsgInfo*)msgview->msginfo;
-       g_return_if_fail(msginfo != NULL);
-
-       msginfo_list = g_slist_append(msginfo_list, msginfo);
-       g_return_if_fail(msginfo_list);
-
-       body =  messageview_get_selection(msgview);
-       compose_reply_mode((ComposeMode)action, msginfo_list, body);
-       g_free(body);
-       g_slist_free(msginfo_list);
-}
-
 static void save_as_cb(gpointer data, guint action, GtkWidget *widget)
 {
        MessageView *messageview = (MessageView *)data;
@@ -1393,3 +1330,16 @@ static void about_cb(gpointer data, guint action, GtkWidget *widget)
 {
        about_show();
 }
+
+static gboolean messageview_update_msg(gpointer source, gpointer data)
+{
+       MsgInfoUpdate *msginfo_update = (MsgInfoUpdate *) source;
+       MessageView *messageview = (MessageView *)data;
+
+       if (msginfo_update->flags & MSGINFO_UPDATE_DELETED) {
+               messageview_clear(messageview);
+               messageview_update(messageview);
+       }
+
+       return FALSE;
+}
index 9308b916bbfa307f9a0782c77d9fec180b779631..60663526742be1f071655961088c061622705d61 100644 (file)
@@ -71,6 +71,8 @@ struct _MessageView
   
        /* From messageview_show */
        gboolean all_headers;
+    
+       gint msginfo_update_callback_id;
 };
 
 MessageView *messageview_create                        (MainWindow     *mainwin);
index ef9b94793973cd93210463888d6d6ccdf0c4a296..6ebbb546127be612a53b16d5d987c2f34cc2429a 100644 (file)
@@ -1367,6 +1367,7 @@ void procmsg_msginfo_set_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgTmp
                update_folder_msg_counts(item, msginfo, perm_flags_old);
 
                msginfo_update.msginfo = msginfo;
+               msginfo_update.flags = MSGINFO_UPDATE_FLAGS;
                hooks_invoke(MSGINFO_UPDATE_HOOKLIST, &msginfo_update);
                folder_item_update(msginfo->folder, F_ITEM_UPDATE_MSGCNT);
        }
@@ -1397,6 +1398,7 @@ void procmsg_msginfo_unset_flags(MsgInfo *msginfo, MsgPermFlags perm_flags, MsgT
                update_folder_msg_counts(item, msginfo, perm_flags_old);
 
                msginfo_update.msginfo = msginfo;
+               msginfo_update.flags = MSGINFO_UPDATE_FLAGS;
                hooks_invoke(MSGINFO_UPDATE_HOOKLIST, &msginfo_update);
                folder_item_update(msginfo->folder, F_ITEM_UPDATE_MSGCNT);
        }
index 650b82d6f6162d1ce51f99d5670a584ecf22c9ef..0bc416932ae5b677f5511b0f4a5a4c7c94c3d1f3 100644 (file)
@@ -144,6 +144,11 @@ typedef guint32 MsgTmpFlags;
 #define MSGINFO_UPDATE_HOOKLIST "msginfo_update"
 #define MAIL_FILTERING_HOOKLIST "mail_filtering_hooklist"
 
+typedef enum {
+       MSGINFO_UPDATE_FLAGS = 1 << 0,
+       MSGINFO_UPDATE_DELETED = 1 << 1,
+} MsgInfoUpdateFlags;
+
 #include "folder.h"
 #include "procmime.h"
 #include "prefs_filtering.h"
@@ -206,6 +211,7 @@ struct _MsgFileInfo
 
 struct _MsgInfoUpdate {
        MsgInfo *msginfo;
+       MsgInfoUpdateFlags flags;
 };
 
 struct _MailFilteringData
index 71c9e841488f5e845f2a8442d7bd5a741d1ec55d..575dafb0951af82dd7e9bd8c8e8618b45d52c299 100644 (file)
@@ -5357,10 +5357,12 @@ static gboolean summary_update_msg(gpointer source, gpointer data)
        g_return_val_if_fail(msginfo_update != NULL, TRUE);
        g_return_val_if_fail(summaryview != NULL, FALSE);
 
-       node = gtk_ctree_find_by_row_data(GTK_CTREE(summaryview->ctree), NULL, msginfo_update->msginfo);
-       
-       if (node) 
-               summary_set_row_marks(summaryview, node);
+       if (msginfo_update->flags & MSGINFO_UPDATE_FLAGS) {
+               node = gtk_ctree_find_by_row_data(GTK_CTREE(summaryview->ctree), NULL, msginfo_update->msginfo);
+
+               if (node) 
+                       summary_set_row_marks(summaryview, node);
+       }
 
        return FALSE;
 }