diff options
-rw-r--r-- | mail/ChangeLog | 32 | ||||
-rw-r--r-- | mail/em-folder-tree.c | 23 | ||||
-rw-r--r-- | mail/mail-component.c | 3 | ||||
-rw-r--r-- | mail/mail-mt.c | 14 | ||||
-rw-r--r-- | mail/mail-mt.h | 1 | ||||
-rw-r--r-- | mail/mail-session.c | 28 | ||||
-rw-r--r-- | mail/message-list.c | 110 | ||||
-rw-r--r-- | mail/message-list.h | 2 |
8 files changed, 144 insertions, 69 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 1f6dc71bc1..22a5631ecf 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,5 +1,37 @@ 2004-05-21 Not Zed <NotZed@Ximian.com> + * mail-mt.c (do_call): add marshaller for p_ppppp call. + + * mail-session.c (get_password): fix for camel api changes. + (forget_password): same. + + ** See #58376. + + * message-list.c (mail_regen_list): do some timeout foo so we + don't keep doing list regnerations if we're getting called too + often. God knows what this will break. + (message_list_set_selected): removede bug printf. + (regen_list_free): move the message-list poking stuff into + regen_list_regened. + (message_list_set_folder): call mail_regen_cancel to cancel any + regen stuff. + (mail_regen_cancel): cancel/clear outstanding regenerations. + (message_list_destroy): do it here too. + (message_list_select_uid): also set the pending select uid if we + have a timeout pending. + + * mail-component.c (impl_createControls): set the defualt parent + to the main folderview as soon as its created. + + * em-folder-tree.c (emft_popup_copy_folder_selected): use + get_toplevel rather than get_ancestor. seems the more reliable + one. also we're always parented so we shoudl always find a + toplevel window. + (em_folder_tree_create_folder): same. + (emft_popup_delete_response): set error parent. + (emft_popup_delete_folder, emft_popup_rename_folder) + (emft_popup_rename_folder, emft_popup_rename_folder): + * em-migrate.c (update_passwords_1_2): finally put the 1.2 password upgrade patch in. Untested. #42721. diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c index e789f5e233..67e16ae0bf 100644 --- a/mail/em-folder-tree.c +++ b/mail/em-folder-tree.c @@ -2007,19 +2007,19 @@ emft_popup_copy_folder_selected (const char *uri, void *data) frombase = priv->selected_path + 1; if (!(fromstore = camel_session_get_store (session, priv->selected_uri, &ex))) { - e_error_run((GtkWindow *)gtk_widget_get_ancestor ((GtkWidget *) cfd->emft, GTK_TYPE_WINDOW), + e_error_run((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *) cfd->emft), cfd->delete?"mail:no-move-folder-notexist":"mail:no-copy-folder-notexist", frombase, uri, ex.desc, NULL); goto fail; } if (cfd->delete && fromstore == mail_component_peek_local_store (NULL) && is_special_local_folder (frombase)) { - e_error_run((GtkWindow *)gtk_widget_get_ancestor ((GtkWidget *) cfd->emft, GTK_TYPE_WINDOW), + e_error_run((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *) cfd->emft), "mail:no-rename-special-folder", frombase, NULL); goto fail; } if (!(tostore = camel_session_get_store (session, uri, &ex))) { - e_error_run((GtkWindow *)gtk_widget_get_ancestor ((GtkWidget *) cfd->emft, GTK_TYPE_WINDOW), + e_error_run((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *) cfd->emft), cfd->delete?"mail:no-move-folder-to-notexist":"mail:no-move-folder-to-notexist", frombase, uri, ex.desc, NULL); goto fail; } @@ -2194,7 +2194,7 @@ em_folder_tree_create_folder (EMFolderTree *emft, const char *path, const char * camel_exception_init (&ex); if (!(store = (CamelStore *) camel_session_get_service (session, uri, CAMEL_PROVIDER_STORE, &ex))) { - e_error_run((GtkWindow *)gtk_widget_get_ancestor((GtkWidget *)emft, GTK_TYPE_WINDOW), + e_error_run((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *)emft), "mail:no-create-folder-nostore", path, ex.desc, NULL); goto fail; } @@ -2398,7 +2398,8 @@ emft_popup_delete_response (GtkWidget *dialog, guint response, EMFolderTree *emf camel_exception_init (&ex); emft_popup_delete_folders (store, path, &ex); if (camel_exception_is_set (&ex)) { - e_error_run(NULL, "mail:no-delete-folder", path, ex.desc, NULL); + e_error_run((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *)emft), + "mail:no-delete-folder", path, ex.desc, NULL); camel_exception_clear (&ex); } } @@ -2429,7 +2430,8 @@ emft_popup_delete_folder (GtkWidget *item, EMFolderTree *emft) return; } - dialog = e_error_new(NULL, "mail:ask-delete-folder", full_name, NULL); + dialog = e_error_new((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *)emft), + "mail:ask-delete-folder", full_name, NULL); g_signal_connect (dialog, "response", G_CALLBACK (emft_popup_delete_response), emft); gtk_widget_show (dialog); } @@ -2462,7 +2464,8 @@ emft_popup_rename_folder (GtkWidget *item, EMFolderTree *emft) /* don't allow user to rename one of the special local folders */ if (store == local && is_special_local_folder (full_name)) { - e_error_run(NULL, "mail:no-rename-spethal-folder", full_name, NULL); + e_error_run((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *)emft), + "mail:no-rename-spethal-folder", full_name, NULL); return; } @@ -2495,7 +2498,8 @@ emft_popup_rename_folder (GtkWidget *item, EMFolderTree *emft) camel_exception_init (&ex); if ((fi = camel_store_get_folder_info (store, path, CAMEL_STORE_FOLDER_INFO_FAST, &ex)) != NULL) { camel_store_free_folder_info (store, fi); - e_error_run(NULL, "mail:no-rename-folder-exists", name, new_name, NULL); + e_error_run((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *)emft), + "mail:no-rename-folder-exists", name, new_name, NULL); } else { const char *oldpath, *newpath; @@ -2507,7 +2511,8 @@ emft_popup_rename_folder (GtkWidget *item, EMFolderTree *emft) camel_exception_clear (&ex); camel_store_rename_folder (store, oldpath, newpath, &ex); if (camel_exception_is_set (&ex)) { - e_error_run(NULL, "mail:no-rename-folder", oldpath, newpath, ex.desc, NULL); + e_error_run((GtkWindow *)gtk_widget_get_toplevel((GtkWidget *)emft), + "mail:no-rename-folder", oldpath, newpath, ex.desc, NULL); camel_exception_clear (&ex); } diff --git a/mail/mail-component.c b/mail/mail-component.c index ad186f961e..4db24e0baf 100644 --- a/mail/mail-component.c +++ b/mail/mail-component.c @@ -531,6 +531,9 @@ impl_createControls (PortableServer_Servant servant, mc_startup(mail_component); view_widget = em_folder_browser_new (); + /* so error boxes have a parent if none supplied */ + e_error_default_parent((GtkWindow *)view_widget); + tree_widget = (GtkWidget *) em_folder_tree_new_with_model (priv->model); em_folder_tree_set_excluded ((EMFolderTree *) tree_widget, 0); em_folder_tree_enable_drag_and_drop ((EMFolderTree *) tree_widget); diff --git a/mail/mail-mt.c b/mail/mail-mt.c index e9830175f0..1581d283bb 100644 --- a/mail/mail-mt.c +++ b/mail/mail-mt.c @@ -738,6 +738,14 @@ do_call(struct _mail_msg *mm) p4 = va_arg(ap, void *); m->ret = m->func(p1, p2, p3, p4); break; + case MAIL_CALL_p_ppppp: + p1 = va_arg(ap, void *); + p2 = va_arg(ap, void *); + p3 = va_arg(ap, void *); + p4 = va_arg(ap, void *); + p5 = va_arg(ap, void *); + m->ret = m->func(p1, p2, p3, p4, p5); + break; case MAIL_CALL_p_ppippp: p1 = va_arg(ap, void *); p2 = va_arg(ap, void *); @@ -894,8 +902,10 @@ static void do_op_status(struct _mail_msg *mm) MAIL_MT_UNLOCK (mail_msg_lock); if (msg->ops->describe_msg) what = msg->ops->describe_msg (msg, FALSE); - else - what = _("Working"); + else { + what = g_strdup_printf("Working %p", msg); + /*what = _("Working");*/ + } data->activity_id = e_activity_handler_operation_started (activity_handler, "evolution-mail", progress_icon, what, TRUE); diff --git a/mail/mail-mt.h b/mail/mail-mt.h index 11a7166d74..b6d402199f 100644 --- a/mail/mail-mt.h +++ b/mail/mail-mt.h @@ -95,6 +95,7 @@ typedef enum { MAIL_CALL_p_pp, MAIL_CALL_p_ppp, MAIL_CALL_p_pppp, + MAIL_CALL_p_ppppp, MAIL_CALL_p_ppippp, } mail_call_t; diff --git a/mail/mail-session.c b/mail/mail-session.c index 9b16b99b82..d4c63fdd30 100644 --- a/mail/mail-session.c +++ b/mail/mail-session.c @@ -86,8 +86,8 @@ typedef struct _MailSessionClass { static CamelSessionClass *ms_parent_class; -static char *get_password(CamelSession *session, const char *prompt, guint32 flags, CamelService *service, const char *item, CamelException *ex); -static void forget_password(CamelSession *session, CamelService *service, const char *item, CamelException *ex); +static char *get_password(CamelSession *session, CamelService *service, const char *domain, const char *prompt, const char *item, guint32 flags, CamelException *ex); +static void forget_password(CamelSession *session, CamelService *service, const char *domain, const char *item, CamelException *ex); static gboolean alert_user(CamelSession *session, CamelSessionAlertType type, const char *prompt, gboolean cancel); static CamelFilterDriver *get_filter_driver(CamelSession *session, const char *type, CamelException *ex); @@ -172,15 +172,16 @@ struct _pass_msg { struct _mail_msg msg; CamelSession *session; - const char *prompt; - guint32 flags; CamelService *service; + const char *domain; + const char *prompt; const char *item; + guint32 flags; CamelException *ex; char *service_url; char *key; - + EAccountService *config_service; GtkWidget *check; GtkWidget *entry; @@ -323,7 +324,7 @@ do_get_pass(struct _mail_msg *mm) if (account) m->result = g_strdup(account->source->url); } else if (m->key) { - m->result = e_passwords_get_password ("Mail", m->key); + m->result = e_passwords_get_password (m->domain?m->domain:"Mail", m->key); if (m->result == NULL || (m->flags & CAMEL_SESSION_PASSWORD_REPROMPT)) { if (mail_session->interactive) { request_password(m); @@ -352,8 +353,8 @@ static struct _mail_msg_op get_pass_op = { }; static char * -get_password (CamelSession *session, const char *prompt, guint32 flags, - CamelService *service, const char *item, CamelException *ex) +get_password (CamelSession *session, CamelService *service, const char *domain, + const char *prompt, const char *item, guint32 flags, CamelException *ex) { struct _pass_msg *m, *r; EMsgPort *pass_reply; @@ -369,6 +370,7 @@ get_password (CamelSession *session, const char *prompt, guint32 flags, m->prompt = prompt; m->flags = flags; m->service = service; + m->domain = domain; m->item = item; m->ex = ex; if (service) @@ -395,20 +397,20 @@ get_password (CamelSession *session, const char *prompt, guint32 flags, } static void -main_forget_password (CamelSession *session, CamelService *service, const char *item, CamelException *ex) +main_forget_password (CamelSession *session, CamelService *service, const char *domain, const char *item, CamelException *ex) { char *key = make_key (service, item); - e_passwords_forget_password ("Mail", key); + e_passwords_forget_password (domain?domain:"Mail", key); g_free (key); } static void -forget_password (CamelSession *session, CamelService *service, const char *item, CamelException *ex) +forget_password (CamelSession *session, CamelService *service, const char *domain, const char *item, CamelException *ex) { - mail_call_main(MAIL_CALL_p_pppp, (MailMainFunc)main_forget_password, - session, service, item, ex); + mail_call_main(MAIL_CALL_p_ppppp, (MailMainFunc)main_forget_password, + session, service, domain, item, ex); } /* ********************************************************************** */ diff --git a/mail/message-list.c b/mail/message-list.c index 38b389b062..58f579dc4b 100644 --- a/mail/message-list.c +++ b/mail/message-list.c @@ -181,6 +181,7 @@ static void load_hide_state(MessageList *ml); /* note: @changes is owned/freed by the caller */ /*static void mail_do_regenerate_messagelist (MessageList *list, const char *search, const char *hideexpr, CamelFolderChangeInfo *changes);*/ static void mail_regen_list(MessageList *ml, const char *search, const char *hideexpr, CamelFolderChangeInfo *changes); +static void mail_regen_cancel(MessageList *ml); static void clear_info(char *key, ETreePath *node, MessageList *ml); @@ -565,7 +566,7 @@ message_list_select_uid (MessageList *message_list, const char *uid) if (message_list->folder == NULL) return; - if (message_list->regen) { + if (message_list->regen || message_list->regen_timeout_id) { g_free(message_list->pending_select_uid); message_list->pending_select_uid = g_strdup(uid); } @@ -1800,7 +1801,9 @@ message_list_destroy(GtkObject *object) /* need to do this before removing folder, folderinfo's might not exist after */ save_tree_state(message_list); save_hide_state(message_list); - + + mail_regen_cancel(message_list); + if (message_list->uid_nodemap) { g_hash_table_foreach(message_list->uid_nodemap, (GHFunc)clear_info, message_list); g_hash_table_destroy (message_list->uid_nodemap); @@ -1836,7 +1839,7 @@ message_list_destroy(GtkObject *object) g_source_remove (message_list->seen_id); message_list->seen_id = 0; } - + message_list->destroyed = TRUE; GTK_OBJECT_CLASS (message_list_parent_class)->destroy(object); @@ -2716,19 +2719,8 @@ message_list_set_folder (MessageList *message_list, CamelFolder *folder, const c g_source_remove (message_list->idle_id); message_list->idle_id = 0; } - - /* cancel any outstanding regeneration requests */ - if (message_list->regen) { - GList *l = message_list->regen; - - while (l) { - struct _mail_msg *mm = l->data; - - if (mm->cancel) - camel_operation_cancel(mm->cancel); - l = l->next; - } - } + + mail_regen_cancel(message_list); if (message_list->folder != NULL) { save_tree_state (message_list); @@ -2994,7 +2986,6 @@ message_list_set_selected(MessageList *ml, GPtrArray *uids) for (i=0; i<uids->len; i++) { node = g_hash_table_lookup(ml->uid_nodemap, uids->pdata[i]); - printf("reselecting uid '%s' %s\n", uids->pdata[i], node?"found":"not found"); if (node) e_tree_selection_model_add_to_selection(etsm, node); } @@ -3521,6 +3512,18 @@ regen_list_regened (struct _mail_msg *mm) } else build_flat (m->ml, m->summary, m->changes); + if (m->ml->search && m->ml->search != m->search) + g_free (m->ml->search); + m->ml->search = m->search; + + if (m->ml->regen == NULL && m->ml->pending_select_uid) { + char *uid = m->ml->pending_select_uid; + + m->ml->pending_select_uid = NULL; + message_list_select_uid(m->ml, uid); + g_free(uid); + } + g_signal_emit (m->ml, message_list_signals[MESSAGE_LIST_BUILT], 0); } @@ -3539,10 +3542,6 @@ regen_list_free (struct _mail_msg *mm) if (m->tree) camel_folder_thread_messages_unref (m->tree); - if (m->ml->search && m->ml->search != m->search) - g_free (m->ml->search); - m->ml->search = m->search; - g_free (m->hideexpr); camel_object_unref (m->folder); @@ -3550,18 +3549,9 @@ regen_list_free (struct _mail_msg *mm) if (m->changes) camel_folder_change_info_free (m->changes); - /* This should probably lock the list. - However, since we have a received function, this will always be called in gui thread */ + /* we have to poke this here since we might've been cancelled and regened wont get called */ m->ml->regen = g_list_remove(m->ml->regen, m); - if (m->ml->regen == NULL && m->ml->pending_select_uid) { - char *uid = m->ml->pending_select_uid; - - m->ml->pending_select_uid = NULL; - message_list_select_uid(m->ml, uid); - g_free(uid); - } - g_object_unref(m->ml); } @@ -3572,28 +3562,55 @@ static struct _mail_msg_op regen_list_op = { regen_list_free, }; -static void -mail_regen_list (MessageList *ml, const char *search, const char *hideexpr, CamelFolderChangeInfo *changes) +static gboolean +ml_regen_timeout(struct _regen_list_msg *m) { - struct _regen_list_msg *m; - GConfClient *gconf; - - if (ml->folder == NULL) - return; + m->ml->regen = g_list_prepend(m->ml->regen, m); + /* TODO: we should manage our own thread stuff, would make cancelling outstanding stuff easier */ + e_thread_put (mail_thread_queued, (EMsg *)m); + + m->ml->regen_timeout_msg = NULL; + m->ml->regen_timeout_id = 0; + + return FALSE; +} - /* cancel any outstanding regeneration requests, we rebuild from scratch anyway */ +static void +mail_regen_cancel(MessageList *ml) +{ + /* cancel any outstanding regeneration requests, not we don't clear, they clear themselves */ if (ml->regen) { GList *l = ml->regen; - + while (l) { struct _mail_msg *mm = l->data; - + if (mm->cancel) camel_operation_cancel(mm->cancel); l = l->next; } } + + /* including unqueued ones */ + if (ml->regen_timeout_id) { + g_source_remove(ml->regen_timeout_id); + ml->regen_timeout_id = 0; + mail_msg_free((struct _mail_msg *)ml->regen_timeout_msg); + ml->regen_timeout_msg = NULL; + } +} + +static void +mail_regen_list (MessageList *ml, const char *search, const char *hideexpr, CamelFolderChangeInfo *changes) +{ + struct _regen_list_msg *m; + GConfClient *gconf; + if (ml->folder == NULL) + return; + + mail_regen_cancel(ml); + gconf = mail_config_get_gconf_client (); #ifndef BROKEN_ETREE @@ -3629,10 +3646,13 @@ mail_regen_list (MessageList *ml, const char *search, const char *hideexpr, Came camel_folder_thread_messages_ref(m->tree); } - ml->regen = g_list_prepend(ml->regen, m); - - /* TODO: we should manage our own thread stuff, would make cancelling outstanding stuff easier */ - e_thread_put (mail_thread_queued, (EMsg *)m); + /* if we're busy already kick off timeout processing, so normal updates are immediate */ + if (ml->regen == NULL) + ml_regen_timeout(m); + else { + ml->regen_timeout_msg = m; + ml->regen_timeout_id = g_timeout_add(500, (GSourceFunc)ml_regen_timeout, m); + } } diff --git a/mail/message-list.h b/mail/message-list.h index a6048527e3..c8ec571ec5 100644 --- a/mail/message-list.h +++ b/mail/message-list.h @@ -139,6 +139,8 @@ struct _MessageList { /* list of outstanding regeneration requests */ GList *regen; char *pending_select_uid; /* set if we were busy regnerating while we had a select come in */ + guint regen_timeout_id; + void *regen_timeout_msg; char *frozen_search; /* to save search took place while we were frozen */ |