diff -Naur balsa-1.0.0/libbalsa/mailbox.c balsa-1.0.0-hack/libbalsa/mailbox.c --- balsa-1.0.0/libbalsa/mailbox.c Tue Oct 17 06:59:49 2000 +++ balsa-1.0.0-hack/libbalsa/mailbox.c Sun Nov 12 16:52:13 2000 @@ -63,7 +63,9 @@ CLOSE_MAILBOX, MESSAGE_STATUS_CHANGED, MESSAGE_NEW, + MESSAGES_NEW, MESSAGE_DELETE, + MESSAGES_DELETE, GET_MESSAGE_STREAM, CHECK, SET_UNREAD_MESSAGES_FLAG, @@ -142,6 +144,15 @@ gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, LIBBALSA_TYPE_MESSAGE); + libbalsa_mailbox_signals[MESSAGES_NEW] = + gtk_signal_new("messages-new", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET(LibBalsaMailboxClass, + messages_new), + gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, + GTK_TYPE_POINTER); + libbalsa_mailbox_signals[MESSAGE_DELETE] = gtk_signal_new("message-delete", GTK_RUN_FIRST, @@ -151,6 +162,15 @@ gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, LIBBALSA_TYPE_MESSAGE); + libbalsa_mailbox_signals[MESSAGES_DELETE] = + gtk_signal_new("messages-delete", + GTK_RUN_FIRST, + object_class->type, + GTK_SIGNAL_OFFSET(LibBalsaMailboxClass, + messages_delete), + gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1, + GTK_TYPE_POINTER); + libbalsa_mailbox_signals[SET_UNREAD_MESSAGES_FLAG] = gtk_signal_new("set-unread-messages-flag", GTK_RUN_FIRST, @@ -206,7 +226,9 @@ klass->message_status_changed = NULL; klass->message_new = NULL; + klass->messages_new = NULL; klass->message_delete = NULL; + klass->messages_delete = NULL; klass->get_message_stream = NULL; klass->check = NULL; @@ -493,6 +515,7 @@ glong msgno; LibBalsaMessage *message; HEADER *cur = 0; + GList *messages=NULL; if (CLIENT_CONTEXT_CLOSED(mailbox)) return; @@ -557,8 +580,13 @@ mailbox->new_messages--; - gtk_signal_emit(GTK_OBJECT(mailbox), - libbalsa_mailbox_signals[MESSAGE_NEW], message); + messages=g_list_append(messages, message); + } + + if(messages!=NULL){ + gtk_signal_emit(GTK_OBJECT(mailbox), + libbalsa_mailbox_signals[MESSAGES_NEW], messages); + g_list_free(messages); } if (mailbox->unread_messages > 0) @@ -580,12 +608,15 @@ list = g_list_first(mailbox->message_list); + if(list){ + gtk_signal_emit(GTK_OBJECT(mailbox), + libbalsa_mailbox_signals[MESSAGES_DELETE], list); + } + while (list) { message = list->data; list = list->next; - gtk_signal_emit(GTK_OBJECT(mailbox), - libbalsa_mailbox_signals[MESSAGE_DELETE], message); message->mailbox = NULL; gtk_object_unref(GTK_OBJECT(message)); } @@ -644,14 +675,30 @@ libbalsa_mailbox_open(mailbox, FALSE); /* examine all the message in the mailbox */ + { + GList *p=NULL; + message_list = mailbox->message_list; + while (message_list) { + current_message = LIBBALSA_MESSAGE(message_list->data); + tmp_message_list = message_list->next; + if (current_message->flags & LIBBALSA_MESSAGE_FLAG_DELETED) { + p=g_list_append(p, current_message); + } + message_list = tmp_message_list; + } + if(p){ + gtk_signal_emit(GTK_OBJECT(mailbox), + libbalsa_mailbox_signals[MESSAGES_DELETE], + p); + g_list_free(p); + } + } + message_list = mailbox->message_list; while (message_list) { current_message = LIBBALSA_MESSAGE(message_list->data); tmp_message_list = message_list->next; if (current_message->flags & LIBBALSA_MESSAGE_FLAG_DELETED) { - gtk_signal_emit(GTK_OBJECT(mailbox), - libbalsa_mailbox_signals[MESSAGE_DELETE], - current_message); current_message->mailbox = NULL; gtk_object_unref(GTK_OBJECT(current_message)); mailbox->message_list = diff -Naur balsa-1.0.0/libbalsa/mailbox.h balsa-1.0.0-hack/libbalsa/mailbox.h --- balsa-1.0.0/libbalsa/mailbox.h Fri Oct 6 15:50:50 2000 +++ balsa-1.0.0-hack/libbalsa/mailbox.h Sun Nov 12 06:29:04 2000 @@ -99,8 +99,12 @@ void (*message_new) (LibBalsaMailbox * mailbox, LibBalsaMessage * message); + void (*messages_new) (LibBalsaMailbox * mailbox, + GList * messages); void (*message_delete) (LibBalsaMailbox * mailbox, LibBalsaMessage * message); + void (*messages_delete) (LibBalsaMailbox * mailbox, + GList * messages); void (*message_append) (LibBalsaMailbox * mailbox, LibBalsaMessage * message); void (*message_status_changed) (LibBalsaMailbox * mailbox, diff -Naur balsa-1.0.0/libbalsa/message.c balsa-1.0.0-hack/libbalsa/message.c --- balsa-1.0.0/libbalsa/message.c Sat Nov 11 18:40:09 2000 +++ balsa-1.0.0-hack/libbalsa/message.c Sun Nov 12 06:33:25 2000 @@ -438,6 +438,61 @@ return TRUE; } +gboolean +libbalsa_messages_move(GList * messages, LibBalsaMailbox * dest) +{ + HEADER *cur; + LibBalsaMessage *message; + GList *p; + + g_return_val_if_fail(messages != NULL, FALSE); + g_return_val_if_fail(dest != NULL, FALSE); + /*RETURN_VAL_IF_CONTEXT_CLOSED(message->mailbox, FALSE);*/ + + libbalsa_mailbox_open(dest, TRUE); + + if (!CLIENT_CONTEXT(dest) || dest->readonly == TRUE) { + libbalsa_information(LIBBALSA_INFORMATION_WARNING, + _ + ("Couldn't open destination mailbox (%s) for writing"), + dest->name); + return FALSE; + } + + message=(LibBalsaMessage *)(messages->data); + + if (message->mailbox->readonly == TRUE) { + libbalsa_information(LIBBALSA_INFORMATION_WARNING, + _ + ("Source mailbox (%s) is readonly. Cannot move message"), + message->mailbox->name); + return FALSE; + } + + libbalsa_lock_mutt(); + + p=messages; + while(p){ + message=(LibBalsaMessage *)(p->data); + cur = CLIENT_CONTEXT(message->mailbox)->hdrs[message->msgno]; + mutt_parse_mime_message(CLIENT_CONTEXT(message->mailbox), cur); + mutt_append_message(CLIENT_CONTEXT(dest), + CLIENT_CONTEXT(message->mailbox), cur, 0, 0); + + dest->total_messages++; + + if (message->flags & LIBBALSA_MESSAGE_FLAG_NEW) + dest->unread_messages++; + p=g_list_next(p); + } + + libbalsa_unlock_mutt(); + + libbalsa_mailbox_close(dest); + libbalsa_messages_delete(messages); + return TRUE; +} + static void libbalsa_message_real_clear_flags(LibBalsaMessage * message) { @@ -652,6 +707,19 @@ libbalsa_message_signals[SET_DELETED], TRUE); } +void +libbalsa_messages_delete(GList * messages) +{ + LibBalsaMessage * message; + g_return_if_fail(messages != NULL); + + while(messages){ + message=(LibBalsaMessage *)(messages->data); + gtk_signal_emit(GTK_OBJECT(message), + libbalsa_message_signals[SET_DELETED], TRUE); + messages=g_list_next(messages); + } +} void libbalsa_message_undelete(LibBalsaMessage * message) diff -Naur balsa-1.0.0/libbalsa/message.h balsa-1.0.0-hack/libbalsa/message.h --- balsa-1.0.0/libbalsa/message.h Fri Oct 6 15:50:51 2000 +++ balsa-1.0.0-hack/libbalsa/message.h Sun Nov 12 06:34:07 2000 @@ -124,11 +124,14 @@ LibBalsaMailbox * dest); gboolean libbalsa_message_move(LibBalsaMessage * message, LibBalsaMailbox * mailbox); +gboolean libbalsa_messages_move(GList * messages, + LibBalsaMailbox * mailbox); void libbalsa_message_clear_flags(LibBalsaMessage * message); void libbalsa_message_read(LibBalsaMessage * message); void libbalsa_message_unread(LibBalsaMessage * message); void libbalsa_message_delete(LibBalsaMessage * message); +void libbalsa_messages_delete(GList * messages); void libbalsa_message_undelete(LibBalsaMessage * message); void libbalsa_message_flag(LibBalsaMessage * message); diff -Naur balsa-1.0.0/src/balsa-index-page.c balsa-1.0.0-hack/src/balsa-index-page.c --- balsa-1.0.0/src/balsa-index-page.c Sun Nov 5 20:07:46 2000 +++ balsa-1.0.0-hack/src/balsa-index-page.c Sun Nov 12 17:14:47 2000 @@ -634,12 +634,19 @@ if (page->mailbox == mailbox) /*Transferring to same mailbox? */ return; - list = clist->selection; - while (list) { - message = - gtk_clist_get_row_data(clist, GPOINTER_TO_INT(list->data)); - libbalsa_message_move(message, mailbox); - list = list->next; + { + GList *messages=NULL; + list = clist->selection; + while (list) { + message = + gtk_clist_get_row_data(clist, GPOINTER_TO_INT(list->data)); + messages=g_list_append(messages, message); + list = list->next; + } + if(messages!=NULL){ + libbalsa_messages_move(messages, mailbox); + g_list_free(messages); + } } libbalsa_mailbox_commit_changes(bindex->mailbox); @@ -919,6 +926,7 @@ BalsaIndexPage *page = NULL; LibBalsaMessage *message; gboolean to_trash; + GList *messages=NULL; g_return_if_fail(widget != NULL); g_return_if_fail(index != NULL); @@ -933,12 +941,15 @@ while (list) { message = gtk_clist_get_row_data(GTK_CLIST(index), GPOINTER_TO_INT(list->data)); + messages=g_list_append(messages, message); + list = list->next; + } + if(messages){ if (to_trash) - libbalsa_message_move(message, balsa_app.trash); + libbalsa_messages_move(messages, balsa_app.trash); else - libbalsa_message_delete(message); - - list = list->next; + libbalsa_messages_delete(messages); + g_list_free(messages); } balsa_index_select_next(index); diff -Naur balsa-1.0.0/src/balsa-index.c balsa-1.0.0-hack/src/balsa-index.c --- balsa-1.0.0/src/balsa-index.c Sun Oct 29 23:39:04 2000 +++ balsa-1.0.0-hack/src/balsa-index.c Sun Nov 12 06:43:56 2000 @@ -73,9 +73,15 @@ static void mailbox_message_new_cb(LibBalsaMailbox * mb, LibBalsaMessage * message, BalsaIndex * bindex); +static void mailbox_messages_new_cb(LibBalsaMailbox * mb, + GList * messages, + BalsaIndex * bindex); static void mailbox_message_delete_cb(LibBalsaMailbox * mb, LibBalsaMessage * message, BalsaIndex * bindex); +static void mailbox_messages_delete_cb(LibBalsaMailbox * mb, + GList * message, + BalsaIndex * bindex); /* clist callbacks */ static void button_event_press_cb(GtkCList * clist, GdkEventButton * event, @@ -425,9 +431,15 @@ gtk_signal_connect(GTK_OBJECT(mailbox), "message-new", GTK_SIGNAL_FUNC(mailbox_message_new_cb), (gpointer) bindex); + gtk_signal_connect(GTK_OBJECT(mailbox), "messages-new", + GTK_SIGNAL_FUNC(mailbox_messages_new_cb), + (gpointer) bindex); gtk_signal_connect(GTK_OBJECT(mailbox), "message-delete", GTK_SIGNAL_FUNC(mailbox_message_delete_cb), (gpointer) bindex); + gtk_signal_connect(GTK_OBJECT(mailbox), "messages-delete", + GTK_SIGNAL_FUNC(mailbox_messages_delete_cb), + (gpointer) bindex); gtk_clist_freeze(GTK_CLIST(bindex)); list = mailbox->message_list; @@ -507,7 +519,7 @@ if (message->flags & LIBBALSA_MESSAGE_FLAG_NEW) bindex->first_new_message = row + 1; - gtk_clist_sort(GTK_CLIST(bindex)); + /*gtk_clist_sort(GTK_CLIST(bindex));*/ DO_CLIST_WORKAROUND(GTK_CLIST(bindex)); } @@ -882,7 +894,31 @@ BalsaIndex * bindex) { gnome_triggers_do("You have new mail!", "email", "newmail", NULL); + gtk_clist_freeze(GTK_CLIST (bindex)); balsa_index_add(bindex, message); + if(bindex->mailbox->new_messages==0){ + gtk_clist_sort (GTK_CLIST (bindex)); + } + DO_CLIST_WORKAROUND(GTK_CLIST (bindex)); + gtk_clist_thaw (GTK_CLIST (bindex)); +} + +static void +mailbox_messages_new_cb(LibBalsaMailbox * mb, GList *messages, + BalsaIndex * bindex) +{ + LibBalsaMessage * message; + + gnome_triggers_do("You have new mail!", "email", "newmail", NULL); + gtk_clist_freeze(GTK_CLIST (bindex)); + while(messages){ + message=(LibBalsaMessage *)(messages->data); + balsa_index_add(bindex, message); + messages=g_list_next(messages); + } + gtk_clist_sort (GTK_CLIST (bindex)); + DO_CLIST_WORKAROUND(GTK_CLIST (bindex)); + gtk_clist_thaw (GTK_CLIST (bindex)); } static void @@ -890,6 +926,20 @@ BalsaIndex * bindex) { balsa_index_del(bindex, message); +} + +static void +mailbox_messages_delete_cb(LibBalsaMailbox * mb, GList * messages, + BalsaIndex * bindex) +{ + LibBalsaMessage * message; + gtk_clist_freeze(GTK_CLIST(bindex)); + while(messages){ + message=(LibBalsaMessage *)(messages->data); + balsa_index_del(bindex, message); + messages=g_list_next(messages); + } + gtk_clist_thaw(GTK_CLIST(bindex)); } /*