Fix bug #2447, "Compose window crashes if moving a folder that is being replied to...
authorColin Leroy <colin@colino.net>
Thu, 22 May 2014 20:11:07 +0000 (22:11 +0200)
committerColin Leroy <colin@colino.net>
Thu, 22 May 2014 20:11:07 +0000 (22:11 +0200)
src/compose.c
src/compose.h
src/folder.c
src/main.c
src/prefs_actions.c
src/toolbar.c

index 5da0cc0bb5c52866290a57777e7b26d5cedfa5c4..d0123db80a3e692e4a75e0dd532aafa061875976 100644 (file)
@@ -763,8 +763,8 @@ static GtkTargetEntry compose_mime_types[] =
 
 static gboolean compose_put_existing_to_front(MsgInfo *info)
 {
-       GList *compose_list = compose_get_compose_list();
-       GList *elem = NULL;
+       const GList *compose_list = compose_get_compose_list();
+       const GList *elem = NULL;
        
        if (compose_list) {
                for (elem = compose_list; elem != NULL && elem->data != NULL; 
@@ -2535,7 +2535,7 @@ Compose *compose_redirect(PrefsAccount *account, MsgInfo *msginfo,
        return compose;
 }
 
-GList *compose_get_compose_list(void)
+const GList *compose_get_compose_list(void)
 {
        return compose_list;
 }
@@ -11803,6 +11803,33 @@ static void compose_subject_entry_activated(GtkWidget *widget, gpointer data)
        gtk_widget_grab_focus(compose->text);
 }
 
+void compose_list_update_folders(FolderItem *old_item, FolderItem *new_item)
+{
+       const GList *compose_list = compose_get_compose_list();
+       const GList *elem = NULL;
+       
+       if (compose_list) {
+               for (elem = compose_list; elem != NULL && elem->data != NULL; 
+                    elem = elem->next) {
+                       Compose *c = (Compose*)elem->data;
+
+                       if (c->targetinfo && c->targetinfo->folder == old_item)
+                               c->targetinfo->folder = new_item;
+
+                       if (c->replyinfo && c->replyinfo->folder == old_item)
+                               c->replyinfo->folder = new_item;
+
+                       if (c->fwdinfo && c->fwdinfo->folder == old_item)
+                               c->fwdinfo->folder = new_item;
+
+                       if (c->autosaved_draft && c->autosaved_draft->folder == old_item)
+                               c->autosaved_draft->folder = new_item;
+
+               }
+       }
+}
+
+
 /*
  * End of Source.
  */
index a47511084f38e7a4844bf8743e936338e0feba6c..b7eb4168a322f5bd12a6722051e3000c0483f80c 100644 (file)
@@ -297,7 +297,7 @@ Compose *compose_redirect           (PrefsAccount   *account,
 Compose *compose_reedit                        (MsgInfo        *msginfo,
                                         gboolean        batch);
 
-GList *compose_get_compose_list                (void);
+const GList *compose_get_compose_list  (void);
 
 void compose_entry_append              (Compose          *compose,
                                         const gchar      *address,
@@ -342,4 +342,6 @@ void compose_clear_exit_drafts              (void);
 void compose_reopen_exit_drafts                (void);
 void compose_attach_from_list (Compose *compose, GList *file_list, gboolean free_data);
 void compose_check_for_email_account(Compose *compose);
+void compose_list_update_folders(FolderItem *old_item, FolderItem *new_item);
+
 #endif /* __COMPOSE_H__ */
index 1bd7d9820cb4aa50bce819a4b47aadfed04a9899..52fc192efb9e579885214db29c2efeceec1c370c 100644 (file)
@@ -431,7 +431,8 @@ void folder_item_remove(FolderItem *item)
                        folder_item_remove(sub_item);
                }
        }
-       
+
+       compose_list_update_folders(item, NULL);
        /* remove myself */
        if (item->cache != NULL) {
                msgcache_destroy(item->cache);
@@ -3292,6 +3293,8 @@ static FolderItem *folder_item_move_recursive(FolderItem *src, FolderItem *dest,
        old_id = folder_item_get_identifier(src);
        new_id = folder_item_get_identifier(new_item);
 
+       compose_list_update_folders(src, new_item);
+
        /* if src supports removing, otherwise only copy folder */
        if (src->folder->klass->remove_folder != NULL && !copy) 
                src->folder->klass->remove_folder(src->folder, src);
index 26c7e18c1e5ad6fb93b80e3eabb10fb95f0d79b2..41d49cffd257513036e7763c10332873649b6e89 100644 (file)
@@ -2026,7 +2026,7 @@ static void initial_processing(FolderItem *item, gpointer data)
 
 static gboolean draft_all_messages(void)
 {
-       GList *compose_list = NULL;
+       const GList *compose_list = NULL;
        
        compose_clear_exit_drafts();
        compose_list = compose_get_compose_list();
index 673d9b510da8796fc9b7a56474487e42467191f2..030a66d097636d02e3ec9a50b9329cd674c1f796 100644 (file)
@@ -920,8 +920,8 @@ static void prefs_actions_cancel(GtkWidget *w, gpointer data)
 static void prefs_actions_ok(GtkWidget *widget, gpointer data)
 {
        MainWindow *mainwin = (MainWindow *) data;
-       GList *list;
-       GList *iter;
+       const GList *list;
+       const GList *iter;
        MessageView *msgview;
        Compose *compose;
        GtkListStore *store;
index 8588d5138b0570d3b717ce1f2dc9d582bfdb0f96..0f797808512fd313f6d29c84057157b18b6c694a 100644 (file)
@@ -983,8 +983,8 @@ void toolbar_set_learn_button(Toolbar            *toolbar,
 void toolbar_toggle(guint action, gpointer data)
 {
        MainWindow *mainwin = (MainWindow*)data;
-       GList *list;
-       GList *cur;
+       const GList *list;
+       const GList *cur;
 
        cm_return_if_fail(mainwin != NULL);