2006-07-01 [colin] 2.3.1cvs50
[claws.git] / src / prefs_account.c
index 6e08dc2d818ffd4065fe6025f8a05342998674b4..16bf3626ee8710cafd1ba970e883777852343a87 100644 (file)
@@ -54,6 +54,7 @@
 #include "imap.h"
 #include "remotefolder.h"
 #include "base64.h"
+#include "combobox.h"
 
 static gboolean cancelled;
 static gboolean new_account;
@@ -69,6 +70,12 @@ static GtkWidget *signature_edit_button;
 
 static GSList *prefs_pages = NULL;
 
+struct BasicProtocol {
+       GtkWidget *combobox;
+       GtkWidget *label;
+       GtkWidget *descrlabel;
+};
+
 static struct Basic {
        GtkWidget *acname_entry;
        GtkWidget *default_chkbtn;
@@ -79,7 +86,7 @@ static struct Basic {
 
        GtkWidget *serv_frame;
        GtkWidget *serv_table;
-       GtkWidget *protocol_optmenu;
+       gpointer *protocol_optmenu;
        GtkWidget *recvserv_label;
        GtkWidget *smtpserv_label;
        GtkWidget *nntpserv_label;
@@ -131,7 +138,6 @@ static struct Receive {
 } receive;
 
 static struct Send {
-       GtkWidget *date_chkbtn;
        GtkWidget *msgid_chkbtn;
        GtkWidget *customhdr_chkbtn;
        GtkWidget *smtp_auth_chkbtn;
@@ -140,6 +146,8 @@ static struct Send {
        GtkWidget *smtp_pass_entry;
        GtkWidget *pop_bfr_smtp_chkbtn;
        GtkWidget *pop_bfr_smtp_tm_entry;
+       GtkWidget *pop_auth_timeout_lbl;
+       GtkWidget *pop_auth_minutes_lbl;
 } p_send;
 
 static struct Compose {
@@ -161,6 +169,7 @@ static struct Privacy {
        GtkWidget *default_encrypt_reply_chkbtn;
        GtkWidget *default_sign_chkbtn;
        GtkWidget *save_clear_text_chkbtn;
+       GtkWidget *encrypt_to_self_chkbtn;
 } privacy;
 
 #if USE_OPENSSL
@@ -218,11 +227,20 @@ static struct Advanced {
        GtkWidget *trash_folder_entry;
 } advanced;
 
-static void prefs_account_fix_size                     (void);
+static char *protocol_names[] = {
+       N_("POP3"),
+       NULL,           /* APOP, deprecated */
+       NULL,           /* RPOP, deprecated */
+       N_("IMAP4"),
+       N_("News (NNTP)"),
+       N_("Local mbox file"),
+       N_("None (SMTP only)")
+};
 
 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam);
 static void prefs_account_protocol_set_optmenu         (PrefParam *pparam);
-static void prefs_account_protocol_activated           (GtkMenuItem *menuitem);
+static void prefs_account_protocol_changed             (GtkComboBox *combobox,
+                                                       gpointer data);
 
 static void prefs_account_set_string_from_optmenu      (PrefParam *pparam);
 static void prefs_account_set_optmenu_from_string      (PrefParam *pparam);
@@ -266,7 +284,7 @@ static PrefParam param[] = {
         &basic.org_entry, prefs_set_data_from_entry, prefs_set_entry},
 
        {"protocol", NULL, &tmp_ac_prefs.protocol, P_ENUM,
-        &basic.protocol_optmenu,
+        (GtkWidget **)&basic.protocol_optmenu,
         prefs_account_protocol_set_data_from_optmenu,
         prefs_account_protocol_set_optmenu},
 
@@ -317,7 +335,7 @@ static PrefParam param[] = {
         &receive.rmmail_chkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
 
-       {"message_leave_time", "0", &tmp_ac_prefs.msg_leave_time, P_INT,
+       {"message_leave_time", "7", &tmp_ac_prefs.msg_leave_time, P_INT,
         &receive.leave_time_entry,
         prefs_set_data_from_entry, prefs_set_entry},
 
@@ -350,10 +368,6 @@ static PrefParam param[] = {
         prefs_set_data_from_spinbtn, prefs_set_spinbtn},
 
        /* Send */
-       {"add_date", "TRUE", &tmp_ac_prefs.add_date, P_BOOL,
-        &p_send.date_chkbtn,
-        prefs_set_data_from_toggle, prefs_set_toggle},
-
        {"generate_msgid", "TRUE", &tmp_ac_prefs.gen_msgid, P_BOOL,
         &p_send.msgid_chkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
@@ -441,6 +455,9 @@ static PrefParam param[] = {
        {"save_clear_text", "FALSE", &tmp_ac_prefs.save_encrypted_as_clear_text, P_BOOL,
         &privacy.save_clear_text_chkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
+       {"encrypt_to_self", "FALSE", &tmp_ac_prefs.encrypt_to_self, P_BOOL,
+        &privacy.encrypt_to_self_chkbtn,
+        prefs_set_data_from_toggle, prefs_set_toggle},
        {"privacy_prefs", "", &privacy_prefs, P_STRING,
         NULL, NULL, NULL},
 #if USE_OPENSSL
@@ -628,7 +645,10 @@ static void privacy_system_activated(GtkMenuItem *menuitem)
        gtk_widget_set_sensitive (privacy.default_encrypt_chkbtn, privacy_enabled);
        gtk_widget_set_sensitive (privacy.default_encrypt_reply_chkbtn, privacy_enabled);
        gtk_widget_set_sensitive (privacy.default_sign_chkbtn, privacy_enabled);
-       gtk_widget_set_sensitive (privacy.save_clear_text_chkbtn, privacy_enabled);
+       gtk_widget_set_sensitive (privacy.encrypt_to_self_chkbtn, privacy_enabled);
+       gtk_widget_set_sensitive (privacy.save_clear_text_chkbtn, 
+               privacy_enabled && !gtk_toggle_button_get_active(
+                                       GTK_TOGGLE_BUTTON(privacy.encrypt_to_self_chkbtn)));
 }
 
 void update_privacy_system_menu() {
@@ -705,12 +725,6 @@ static void create_widget_func(PrefsPage * _page,
                        gtk_entry_set_text(GTK_ENTRY(basic.org_entry),
                                           def_ac->organization ? def_ac->organization : "");
                }
-               menu_set_sensitive_all
-                       (GTK_MENU_SHELL
-                               (gtk_option_menu_get_menu
-                                       (GTK_OPTION_MENU
-                                               (basic.protocol_optmenu))),
-                        TRUE);
        } else
                prefs_set_dialog(param);
 
@@ -947,7 +961,8 @@ void destroy_dialog(gpointer data)
        PrefsAccount *ac_prefs = (PrefsAccount *) data;
        if (!cancelled)
                *ac_prefs = tmp_ac_prefs;
-
+       else /* the customhdr_list may have changed, update it anyway */
+               ac_prefs->customhdr_list = (&tmp_ac_prefs)->customhdr_list;
        gtk_main_quit();
 }
 
@@ -1023,34 +1038,6 @@ static void prefs_account_create(void)
 #endif /* USE_OPENSSL */
        prefs_account_advanced_create();
        SET_NOTEBOOK_LABEL(notebook, _("A_dvanced"), page++);
-
-       prefs_account_fix_size();
-}
-
-/**
- * prefs_account_fix_size:
- * 
- * Fix the window size after creating widgets by selecting "Local"
- * protocol (currently it has the largest size of parameter widgets).
- * Without this the window gets too large.
- **/
-static void prefs_account_fix_size(void)
-{
-       GtkOptionMenu *optmenu = GTK_OPTION_MENU (basic.protocol_optmenu);
-       GtkWidget *menu;
-       GtkWidget *menuitem;
-
-       gtk_option_menu_set_history (optmenu, 4); /* local */
-       menu = gtk_option_menu_get_menu (optmenu);
-       menuitem = gtk_menu_get_active (GTK_MENU (menu));
-       gtk_menu_item_activate (GTK_MENU_ITEM (menuitem));
-}
-
-#define SET_ACTIVATE(menuitem) \
-{ \
-       g_signal_connect(G_OBJECT(menuitem), "activate", \
-                        G_CALLBACK(prefs_account_protocol_activated), \
-                        NULL); \
 }
 
 #define TABLE_YPAD 2
@@ -1070,9 +1057,9 @@ static void prefs_account_basic_create(void)
 
        GtkWidget *serv_frame;
        GtkWidget *vbox2;
+       GtkWidget *optmenubox;
        GtkWidget *optmenu;
-       GtkWidget *optmenu_menu;
-       GtkWidget *menuitem;
+       GtkWidget *optlabel;
        GtkWidget *serv_table;
        GtkWidget *recvserv_label;
        GtkWidget *smtpserv_label;
@@ -1091,6 +1078,11 @@ static void prefs_account_basic_create(void)
        GtkWidget *pass_label;
        GtkWidget *uid_entry;
        GtkWidget *pass_entry;
+       GtkListStore *menu;
+       GtkTreeIter iter;
+
+       struct BasicProtocol *protocol_optmenu;
+       gint i;
 
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
@@ -1174,24 +1166,34 @@ static void prefs_account_basic_create(void)
        gtk_widget_show (label);
        gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
 
-       optmenu = gtk_option_menu_new ();
-       gtk_widget_show (optmenu);
-       gtk_box_pack_start (GTK_BOX (hbox), optmenu, FALSE, FALSE, 0);
+       /* Create GtkHBox for protocol combobox and label */
+       optmenubox = gtk_hbox_new(FALSE, 20);
+       gtk_widget_show(optmenubox);
+       gtk_box_pack_start (GTK_BOX (hbox), optmenubox, FALSE, FALSE, 0);
 
-       optmenu_menu = gtk_menu_new ();
+       /* Create and populate the combobox */
+       optmenu = gtkut_sc_combobox_create(NULL, FALSE);
+       gtk_box_pack_start(GTK_BOX (optmenubox), optmenu, FALSE, FALSE, 0);
 
-       MENUITEM_ADD (optmenu_menu, menuitem, _("POP3"),  A_POP3);
-       SET_ACTIVATE (menuitem);
-       MENUITEM_ADD (optmenu_menu, menuitem, _("IMAP4"), A_IMAP4);
-       SET_ACTIVATE (menuitem);
-       MENUITEM_ADD (optmenu_menu, menuitem, _("News (NNTP)"), A_NNTP);
-       SET_ACTIVATE (menuitem);
-       MENUITEM_ADD (optmenu_menu, menuitem, _("Local mbox file"), A_LOCAL);
-       SET_ACTIVATE (menuitem);
-       MENUITEM_ADD (optmenu_menu, menuitem, _("None (SMTP only)"), A_NONE);
-       SET_ACTIVATE (menuitem);
+       menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)));
+       for( i = 0; i < NUM_RECV_PROTOCOLS; i++ )
+               if( protocol_names[i] != NULL )
+                       COMBOBOX_ADD (menu, protocol_names[i], i);
 
-       gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
+       g_signal_connect(G_OBJECT(optmenu), "changed",
+                       G_CALLBACK(prefs_account_protocol_changed), NULL);
+
+       /* Create protocol label, empty for now */
+       optlabel = gtk_label_new("");
+       gtk_label_set_use_markup(GTK_LABEL(optlabel), TRUE);
+       gtk_label_set_justify(GTK_LABEL(optlabel), GTK_JUSTIFY_CENTER);
+       gtk_box_pack_start(GTK_BOX (optmenubox), optlabel, FALSE, FALSE, 0);
+
+       /* Set up a struct to store pointers to necessary widgets */
+       protocol_optmenu = g_new(struct BasicProtocol, 1);
+       protocol_optmenu->combobox = optmenu;
+       protocol_optmenu->label = optlabel;
+       protocol_optmenu->descrlabel = label;
 
        serv_table = gtk_table_new (6, 4, FALSE);
        gtk_widget_show (serv_table);
@@ -1329,7 +1331,7 @@ static void prefs_account_basic_create(void)
 
        basic.serv_frame       = serv_frame;
        basic.serv_table       = serv_table;
-       basic.protocol_optmenu = optmenu;
+       basic.protocol_optmenu = (gpointer)protocol_optmenu;
        basic.recvserv_label   = recvserv_label;
        basic.recvserv_entry   = recvserv_entry;
        basic.smtpserv_label   = smtpserv_label;
@@ -1585,6 +1587,7 @@ static void prefs_account_receive_create(void)
        MENUITEM_ADD (optmenu_menu, menuitem, _("Automatic"), 0);
        MENUITEM_ADD (optmenu_menu, menuitem, "LOGIN", IMAP_AUTH_LOGIN);
        MENUITEM_ADD (optmenu_menu, menuitem, "CRAM-MD5", IMAP_AUTH_CRAM_MD5);
+       MENUITEM_ADD (optmenu_menu, menuitem, "ANONYMOUS", IMAP_AUTH_ANON);
 
        gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
 
@@ -1647,7 +1650,6 @@ static void prefs_account_send_create(void)
        GtkWidget *vbox1;
        GtkWidget *vbox2;
        GtkWidget *frame;
-       GtkWidget *date_chkbtn;
        GtkWidget *msgid_chkbtn;
        GtkWidget *hbox;
        GtkWidget *customhdr_chkbtn;
@@ -1665,6 +1667,8 @@ static void prefs_account_send_create(void)
        GtkWidget *vbox_spc;
        GtkWidget *pop_bfr_smtp_chkbtn;
        GtkWidget *pop_bfr_smtp_tm_entry;
+       GtkWidget *pop_auth_timeout_lbl;
+       GtkWidget *pop_auth_minutes_lbl;
 
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
@@ -1678,7 +1682,6 @@ static void prefs_account_send_create(void)
        gtk_container_add (GTK_CONTAINER (frame), vbox2);
        gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
 
-       PACK_CHECK_BUTTON (vbox2, date_chkbtn, _("Add Date"));
        PACK_CHECK_BUTTON (vbox2, msgid_chkbtn, _("Generate Message-ID"));
 
        hbox = gtk_hbox_new (FALSE, 12);
@@ -1808,22 +1811,21 @@ static void prefs_account_send_create(void)
        gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
        gtk_widget_set_size_request (hbox_spc, 12, -1);
 
-       label = gtk_label_new(_("POP authentication timeout: "));
-       gtk_widget_show (label);
-       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+       pop_auth_timeout_lbl = gtk_label_new(_("POP authentication timeout: "));
+       gtk_widget_show (pop_auth_timeout_lbl);
+       gtk_box_pack_start (GTK_BOX (hbox), pop_auth_timeout_lbl, FALSE, FALSE, 0);
 
        pop_bfr_smtp_tm_entry = gtk_entry_new ();
        gtk_widget_show (pop_bfr_smtp_tm_entry);
        gtk_widget_set_size_request (pop_bfr_smtp_tm_entry, 30, -1);
        gtk_box_pack_start (GTK_BOX (hbox), pop_bfr_smtp_tm_entry, FALSE, FALSE, 0);
 
-       label = gtk_label_new(_("minutes"));
-       gtk_widget_show (label);
-       gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+       pop_auth_minutes_lbl = gtk_label_new(_("minutes"));
+       gtk_widget_show (pop_auth_minutes_lbl);
+       gtk_box_pack_start (GTK_BOX (hbox), pop_auth_minutes_lbl, FALSE, FALSE, 0);
 
 
        
-       p_send.date_chkbtn      = date_chkbtn;
        p_send.msgid_chkbtn     = msgid_chkbtn;
        p_send.customhdr_chkbtn = customhdr_chkbtn;
 
@@ -1833,6 +1835,8 @@ static void prefs_account_send_create(void)
        p_send.smtp_pass_entry        = smtp_pass_entry;
        p_send.pop_bfr_smtp_chkbtn    = pop_bfr_smtp_chkbtn;
        p_send.pop_bfr_smtp_tm_entry  = pop_bfr_smtp_tm_entry;
+       p_send.pop_auth_timeout_lbl   = pop_auth_timeout_lbl;
+       p_send.pop_auth_minutes_lbl   = pop_auth_minutes_lbl;
 }
 
 static void prefs_account_compose_create(void)
@@ -2008,6 +2012,7 @@ static void prefs_account_privacy_create(void)
        GtkWidget *default_encrypt_reply_chkbtn;
        GtkWidget *default_sign_chkbtn;
        GtkWidget *save_clear_text_chkbtn;
+       GtkWidget *encrypt_to_self_chkbtn;
 
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
        gtk_widget_show (vbox1);
@@ -2030,21 +2035,26 @@ static void prefs_account_privacy_create(void)
        gtk_widget_show (default_privacy_system);
        gtk_box_pack_start (GTK_BOX(hbox1), default_privacy_system, FALSE, TRUE, 0);
 
+       PACK_CHECK_BUTTON (vbox2, default_sign_chkbtn,
+                          _("Always sign messages"));
        PACK_CHECK_BUTTON (vbox2, default_encrypt_chkbtn,
-                          _("Encrypt message by default"));
+                          _("Always encrypt messages"));
        PACK_CHECK_BUTTON (vbox2, default_encrypt_reply_chkbtn,
-                          _("Encrypt message by default when replying to an "
+                          _("Always encrypt messages when replying to an "
                             "encrypted message"));
-       PACK_CHECK_BUTTON (vbox2, default_sign_chkbtn,
-                          _("Sign message by default"));
+       PACK_CHECK_BUTTON (vbox2, encrypt_to_self_chkbtn,
+                          _("Encrypt sent messages with your own key in addition to recipient's"));
        PACK_CHECK_BUTTON (vbox2, save_clear_text_chkbtn,
                           _("Save sent encrypted messages as clear text"));
 
+       SET_TOGGLE_SENSITIVITY_REVERSE(encrypt_to_self_chkbtn, save_clear_text_chkbtn);
+
        privacy.default_privacy_system = default_privacy_system;
        privacy.default_encrypt_chkbtn = default_encrypt_chkbtn;
        privacy.default_encrypt_reply_chkbtn = default_encrypt_reply_chkbtn;
        privacy.default_sign_chkbtn    = default_sign_chkbtn;
        privacy.save_clear_text_chkbtn = save_clear_text_chkbtn;
+       privacy.encrypt_to_self_chkbtn = encrypt_to_self_chkbtn;
 }
 
 #if USE_OPENSSL
@@ -2468,15 +2478,10 @@ static void prefs_account_advanced_create(void)
 static gint prefs_account_apply(void)
 {
        RecvProtocol protocol;
-       GtkWidget *menu;
-       GtkWidget *menuitem;
        gchar *old_id = NULL;
        gchar *new_id = NULL;
        
-       menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(basic.protocol_optmenu));
-       menuitem = gtk_menu_get_active(GTK_MENU(menu));
-       protocol = GPOINTER_TO_INT
-               (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
+       protocol = combobox_get_active_data(GTK_COMBO_BOX(basic.protocol_optmenu));
 
        if (*gtk_entry_get_text(GTK_ENTRY(basic.acname_entry)) == '\0') {
                alertpanel_error(_("Account name is not entered."));
@@ -2549,6 +2554,10 @@ static void pop_bfr_smtp_tm_set_sens(GtkWidget *widget, gpointer data)
 {
        gtk_widget_set_sensitive(p_send.pop_bfr_smtp_tm_entry, 
                                 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(p_send.pop_bfr_smtp_chkbtn)));
+       gtk_widget_set_sensitive(p_send.pop_auth_timeout_lbl, 
+                                gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(p_send.pop_bfr_smtp_chkbtn)));
+       gtk_widget_set_sensitive(p_send.pop_auth_minutes_lbl, 
+                                gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(p_send.pop_bfr_smtp_chkbtn)));
 }
 
 static void prefs_account_select_folder_cb(GtkWidget *widget, gpointer data)
@@ -2646,35 +2655,43 @@ static void prefs_account_enum_set_radiobtn(PrefParam *pparam)
 
 static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam)
 {
-       GtkWidget *menu;
-       GtkWidget *menuitem;
+       struct BasicProtocol *protocol_optmenu =
+               (struct BasicProtocol *)*pparam->widget;
+       GtkWidget *optmenu = protocol_optmenu->combobox;
 
-       menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
-       menuitem = gtk_menu_get_active(GTK_MENU(menu));
-       *((RecvProtocol *)pparam->data) = GPOINTER_TO_INT
-               (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
+       *((RecvProtocol *)pparam->data) =
+               combobox_get_active_data(GTK_COMBO_BOX(optmenu));
 }
 
 static void prefs_account_protocol_set_optmenu(PrefParam *pparam)
 {
        RecvProtocol protocol;
-       GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
-       GtkWidget *menu;
-       GtkWidget *menuitem;
-       gint index;
+       struct BasicProtocol *protocol_optmenu =
+               (struct BasicProtocol *)*pparam->widget;
+       GtkWidget *optmenu = protocol_optmenu->combobox;
+       GtkWidget *optlabel = protocol_optmenu->label;
+       GtkWidget *descrlabel = protocol_optmenu->descrlabel;
+       gchar *label = NULL;
 
        protocol = *((RecvProtocol *)pparam->data);
-       index = menu_find_option_menu_index
-               (optmenu, GINT_TO_POINTER(protocol), NULL);
-       if (index < 0) return;
-       gtk_option_menu_set_history(optmenu, index);
-
-       menu = gtk_option_menu_get_menu(optmenu);
-       menu_set_insensitive_all(GTK_MENU_SHELL(menu));
 
-       menuitem = gtk_menu_get_active(GTK_MENU(menu));
-       gtk_widget_set_sensitive(menuitem, TRUE);
-       gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
+       /* Set combobox to correct value even if it will be hidden, so
+        * we won't break existing accounts when saving. */
+       combobox_select_by_data(GTK_COMBO_BOX(optmenu), protocol);
+
+       /* Set up widgets accordingly */
+       if( new_account ) {
+               gtk_label_set_text(GTK_LABEL(descrlabel), _("Protocol"));
+               gtk_widget_hide(optlabel);
+               gtk_widget_show(optmenu);
+       } else {
+               gtk_label_set_text(GTK_LABEL(descrlabel), _("Protocol:"));
+               label = g_markup_printf_escaped("<b>%s</b>", protocol_names[protocol]);
+               gtk_label_set_markup(GTK_LABEL(optlabel), label);
+               g_free(label);
+               gtk_widget_hide(optmenu);
+               gtk_widget_show(optlabel);
+       }
 }
 
 static void prefs_account_imap_auth_type_set_data_from_optmenu(PrefParam *pparam)
@@ -2702,6 +2719,9 @@ static void prefs_account_imap_auth_type_set_optmenu(PrefParam *pparam)
        case IMAP_AUTH_CRAM_MD5:
                gtk_option_menu_set_history(optmenu, 2);
                break;
+       case IMAP_AUTH_ANON:
+               gtk_option_menu_set_history(optmenu, 3);
+               break;
        case 0:
        default:
                gtk_option_menu_set_history(optmenu, 0);
@@ -2818,12 +2838,11 @@ static void prefs_account_set_optmenu_from_string(PrefParam *pparam)
        g_list_free(children);
 }
 
-static void prefs_account_protocol_activated(GtkMenuItem *menuitem)
+static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
 {
        RecvProtocol protocol;
 
-       protocol = GPOINTER_TO_INT
-               (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
+       protocol = combobox_get_active_data(combobox);
 
        switch(protocol) {
        case A_NNTP: