I've come up with a new algorithm that I hope will satisfy everyone.

if you are interested, apply the attached patch to your CVS checkout of
evolution and see if it works for you.

cd /cvs/evolution/mail && patch -p0 -i ~/guess-me.patch

Jeff

-- 
Jeffrey Stedfast
Evolution Hacker - Ximian, Inc.
[EMAIL PROTECTED]  - www.ximian.com
? guess-me.patch
? mfc.c
Index: ChangeLog
===================================================================
RCS file: /cvs/gnome/evolution/mail/ChangeLog,v
retrieving revision 1.2421
diff -u -r1.2421 ChangeLog
--- ChangeLog   1 Oct 2002 20:30:26 -0000       1.2421
+++ ChangeLog   2 Oct 2002 20:22:26 -0000
@@ -1,3 +1,12 @@
+2002-10-02  Jeffrey Stedfast  <[EMAIL PROTECTED]>
+
+       * mail-callbacks.c (mail_generate_reply): Don't default 'me' to
+       the source account until after we've tried to detect the account
+       based on recipients. When adding accounts to the account hash, if
+       any accounts have identical email addresses, the ones that are
+       enabled take precedence over ones that aren't. This will hopefully
+       make everyone happy with reply account picking.
+
 2002-10-01  Larry Ewing  <[EMAIL PROTECTED]>
 
        * mail-display.c (drag_data_get_cb): add support for dragging the
Index: mail-callbacks.c
===================================================================
RCS file: /cvs/gnome/evolution/mail/mail-callbacks.c,v
retrieving revision 1.394
diff -u -r1.394 mail-callbacks.c
--- mail-callbacks.c    30 Sep 2002 20:11:05 -0000      1.394
+++ mail-callbacks.c    2 Oct 2002 20:22:26 -0000
@@ -1008,7 +1008,7 @@
        const char *name = NULL, *address = NULL, *source = NULL;
        const char *message_id, *references, *reply_addr = NULL;
        char *text = NULL, *subject, date_str[100], *format;
-       const MailConfigAccount *account, *me = NULL;
+       const MailConfigAccount *def, *account, *me = NULL;
        const GSList *l, *accounts = NULL;
        GHashTable *account_hash = NULL;
        GList *to = NULL, *cc = NULL;
@@ -1035,13 +1035,37 @@
        
        /* Set the recipients */
        accounts = mail_config_get_accounts ();
-       
        account_hash = g_hash_table_new (g_strcase_hash, g_strcase_equal);
+       
+       /* add the default account to the hash first */
+       if ((def = mail_config_get_default_account ())) {
+               if (def->id->address)
+                       g_hash_table_insert (account_hash, (char *) def->id->address, 
+(void *) def);
+       }
+       
        l = accounts;
        while (l) {
                account = l->data;
-               if (account->id->address)
-                       g_hash_table_insert (account_hash, (char *) 
account->id->address, (void *) account);
+               
+               if (account->id->address) {
+                       const MailConfigAccount *acnt;
+                       
+                       /* Accounts with identical email addresses that are enabled
+                        * take precedence over the accounts that aren't. If all
+                        * accounts with matching email addresses are disabled, then
+                        * the first one in the list takes precedence. The default
+                        * account always takes precedence no matter what.
+                        */
+                       acnt = g_hash_table_lookup (account_hash, 
+account->id->address);
+                       if (acnt && acnt != def && !acnt->source->enabled && 
+account->source->enabled) {
+                               g_hash_table_remove (account_hash, acnt->id->address);
+                               acnt = NULL;
+                       }
+                       
+                       if (!acnt)
+                               g_hash_table_insert (account_hash, (char *) 
+account->id->address, (void *) account);
+               }
+               
                l = l->next;
        }
        
@@ -1050,11 +1074,6 @@
        mail_ignore_address (composer, to_addrs);
        mail_ignore_address (composer, cc_addrs);
        
-       /* default 'me' to the source account... */
-       source = camel_mime_message_get_source (message);
-       if (source)
-               me = mail_config_get_account_by_source_url (source);
-       
  determine_recipients:
        if (mode == REPLY_LIST) {
                CamelMessageInfo *info;
@@ -1112,8 +1131,7 @@
                        }
                }
                
-               if (!me)
-                       me = guess_me (to_addrs, cc_addrs, account_hash);
+               me = guess_me (to_addrs, cc_addrs, account_hash);
        } else {
                GHashTable *rcpt_hash;
                EDestination *dest;
@@ -1153,14 +1171,19 @@
                                cc = g_list_remove_link (cc, to);
                        }
                } else {
-                       if (!me)
-                               me = guess_me (to_addrs, cc_addrs, account_hash);
+                       me = guess_me (to_addrs, cc_addrs, account_hash);
                }
                
                g_hash_table_destroy (rcpt_hash);
        }
        
        g_hash_table_destroy (account_hash);
+       
+       if (!me) {
+               /* default 'me' to the source account... */
+               if ((source = camel_mime_message_get_source (message)))
+                       me = mail_config_get_account_by_source_url (source);
+       }
        
        /* set body text here as we want all ignored words to take effect */
        switch (mail_config_get_default_reply_style ()) {

Reply via email to