remove all gtk3 conditionals
[claws.git] / src / prefs_account.c
index d94b384f6616b57e945d99a67b2f9072853e4712..5f1cc8fdd9a9a0b7b000561ec479ee96d5022b29 100644 (file)
 #include <string.h>
 #include <stdlib.h>
 #include <ctype.h>
-#if !GTK_CHECK_VERSION(3, 0, 0)
 #include "gtkcmoptionmenu.h"
-#endif
 #include "main.h"
 #include "prefs_gtk.h"
 #include "prefs_account.h"
+#include "prefs_receive.h"
 #include "prefs_common.h"
 #include "prefs_customheader.h"
 #include "account.h"
@@ -64,6 +63,7 @@
 #include "inputdialog.h"
 #include "ssl_certificate.h"
 #include "passwordstore.h"
+#include "file-utils.h"
 
 static gboolean cancelled;
 static gboolean new_account;
@@ -83,6 +83,12 @@ static GtkWidget *in_ssl_cert_browse_button;
 static GtkWidget *out_ssl_cert_browse_button;
 #endif
 
+struct AutocheckWidgets {
+       GtkWidget *autochk_hour_spinbtn;
+       GtkWidget *autochk_min_spinbtn;
+       GtkWidget *autochk_sec_spinbtn;
+};
+
 static GSList *prefs_pages = NULL;
 
 typedef struct BasicPage
@@ -141,6 +147,8 @@ typedef struct ReceivePage
        GtkWidget *inbox_entry;
        GtkWidget *inbox_btn;
 
+       GtkWidget *autochk_frame;
+
        GtkWidget *local_frame;
        GtkWidget *local_inbox_label;
        GtkWidget *local_inbox_entry;
@@ -161,6 +169,10 @@ typedef struct ReceivePage
        GtkWidget *maxarticle_label;
        GtkWidget *maxarticle_spinbtn;
        GtkAdjustment *maxarticle_spinbtn_adj;
+
+       GtkWidget *autochk_checkbtn;
+       GtkWidget *autochk_use_default_checkbtn;
+       struct AutocheckWidgets *autochk_widgets;
 } ReceivePage;
 
 typedef struct SendPage
@@ -310,10 +322,8 @@ typedef struct AdvancedPage
        GtkWidget *nntpport_spinbtn;
        GtkWidget *domain_checkbtn;
        GtkWidget *domain_entry;
-#if !GTK_CHECK_VERSION(3, 0, 0)
        GtkWidget *crosspost_checkbtn;
        GtkWidget *crosspost_colormenu;
-#endif
 
 #ifndef G_OS_WIN32
        GtkWidget *tunnelcmd_checkbtn;
@@ -373,14 +383,15 @@ static void prefs_account_smtp_auth_type_set_data_from_optmenu
                                                        (PrefParam *pparam);
 static void prefs_account_smtp_auth_type_set_optmenu   (PrefParam *pparam);
 
+static void prefs_account_set_autochk_interval_from_widgets(PrefParam *pparam);
+static void prefs_account_set_autochk_interval_to_widgets(PrefParam *pparam);
+
 static void prefs_account_enum_set_data_from_radiobtn  (PrefParam *pparam);
 static void prefs_account_enum_set_radiobtn            (PrefParam *pparam);
 
-#if !GTK_CHECK_VERSION(3, 0, 0)
 static void crosspost_color_toggled(void);
 static void prefs_account_crosspost_set_data_from_colormenu(PrefParam *pparam);
 static void prefs_account_crosspost_set_colormenu(PrefParam *pparam);
-#endif
 
 static void prefs_account_nntpauth_toggled(GtkToggleButton *button,
                                           gpointer user_data);
@@ -529,6 +540,22 @@ static PrefParam receive_param[] = {
         &receive_page.low_bandwidth_checkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
 
+       {"autochk_use_default", "TRUE", &tmp_ac_prefs.autochk_use_default, P_BOOL,
+               &receive_page.autochk_use_default_checkbtn,
+               prefs_set_data_from_toggle, prefs_set_toggle},
+
+       {"autochk_use_custom", "FALSE", &tmp_ac_prefs.autochk_use_custom, P_BOOL,
+               &receive_page.autochk_checkbtn,
+               prefs_set_data_from_toggle, prefs_set_toggle},
+
+       /* Here we lie a bit, passing a pointer to our custom struct,
+        * disguised as a GtkWidget pointer, to get around the
+        * inflexibility of PrefParam system. */
+       {"autochk_interval", "600", &tmp_ac_prefs.autochk_itv, P_INT,
+               (GtkWidget **)&receive_page.autochk_widgets,
+               prefs_account_set_autochk_interval_from_widgets,
+               prefs_account_set_autochk_interval_to_widgets},
+
        {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
 };
 
@@ -842,9 +869,8 @@ static PrefParam proxy_param[] = {
        &proxy_page.proxy_name_entry,
        prefs_set_data_from_entry, prefs_set_entry},
 
-       {"proxy_pass", "", &tmp_ac_prefs.proxy_info.proxy_pass, P_PASSWORD,
-       &proxy_page.proxy_pass_entry,
-       prefs_set_data_from_entry, prefs_set_entry},
+       {"proxy_pass", NULL, &tmp_ac_prefs.proxy_info.proxy_pass, P_PASSWORD,
+       NULL, NULL, NULL},
 
 
        {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
@@ -908,7 +934,6 @@ static PrefParam advanced_param[] = {
         &advanced_page.tunnelcmd_entry,
         prefs_set_data_from_entry, prefs_set_entry},
 #endif
-#if !GTK_CHECK_VERSION(3, 0, 0)
        {"mark_crosspost_read", "FALSE", &tmp_ac_prefs.mark_crosspost_read, P_BOOL,
         &advanced_page.crosspost_checkbtn,
         prefs_set_data_from_toggle, prefs_set_toggle},
@@ -917,7 +942,6 @@ static PrefParam advanced_param[] = {
         &advanced_page.crosspost_colormenu,
         prefs_account_crosspost_set_data_from_colormenu,
         prefs_account_crosspost_set_colormenu},
-#endif
 
        {"set_sent_folder", "FALSE", &tmp_ac_prefs.set_sent_folder, P_BOOL,
         &advanced_page.sent_folder_checkbtn,
@@ -984,6 +1008,8 @@ static void auto_configure_cb                      (GtkWidget      *widget,
 #endif
 static void prefs_account_edit_custom_header   (void);
 
+static void prefs_account_receive_itv_spinbutton_value_changed_cb(GtkWidget *w,
+                                         gpointer data);
 
 #define COMBOBOX_PRIVACY_PLUGIN_ID 3
 
@@ -1473,9 +1499,9 @@ static void receive_create_widget_func(PrefsPage * _page,
        ReceivePage *page = (ReceivePage *) _page;
        PrefsAccount *ac_prefs = (PrefsAccount *) data;
 
-       GtkWidget *vbox1;
+       GtkWidget *vbox1, *vbox2, *vbox3, *vbox4;
+       GtkWidget *hbox1, *hbox2;
        GtkWidget *frame1;
-       GtkWidget *vbox2;
        GtkWidget *use_apop_checkbtn;
        GtkWidget *rmmail_checkbtn;
        GtkWidget *hbox_spc;
@@ -1483,13 +1509,11 @@ static void receive_create_widget_func(PrefsPage * _page,
        GtkWidget *leave_time_spinbtn;
        GtkWidget *leave_hour_label;
        GtkWidget *leave_hour_spinbtn;
-       GtkWidget *hbox1;
        GtkWidget *size_limit_checkbtn;
        GtkWidget *size_limit_spinbtn;
        GtkWidget *label;
        GtkWidget *filter_on_recv_checkbtn;
        GtkWidget *filterhook_on_recv_checkbtn;
-       GtkWidget *vbox3;
        GtkWidget *inbox_label;
        GtkWidget *inbox_entry;
        GtkWidget *inbox_btn;
@@ -1504,14 +1528,20 @@ static void receive_create_widget_func(PrefsPage * _page,
        GtkWidget *local_inbox_label;
        GtkWidget *local_inbox_entry;
        GtkWidget *local_inbox_btn;
+       GtkWidget *autochk_checkbtn;
+       GtkWidget *autochk_hour_spinbtn, *autochk_hour_label;
+       GtkWidget *autochk_min_spinbtn, *autochk_min_label;
+       GtkWidget *autochk_sec_spinbtn, *autochk_sec_label;
+       GtkWidget *autochk_use_default_checkbtn;
+       GtkObject *adj;
+       struct AutocheckWidgets *autochk_widgets;
 
        GtkWidget *optmenu;
        GtkListStore *menu;
        GtkTreeIter iter;
        GtkWidget *recvatgetall_checkbtn;
 
-       GtkWidget *hbox2;
-       GtkWidget *frame2;
+       GtkWidget *frame, *frame2;
        GtkWidget *maxarticle_label;
        GtkWidget *maxarticle_spinbtn;
        GtkAdjustment *maxarticle_spinbtn_adj;
@@ -1723,12 +1753,69 @@ static void receive_create_widget_func(PrefsPage * _page,
        gtk_widget_show (hbox1);
        gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 4);
 
+       /* Auto-checking */
+       vbox4 = gtkut_get_options_frame(vbox1, &frame, _("Automatic checking"));
+
+       PACK_CHECK_BUTTON(vbox4, autochk_use_default_checkbtn,
+                       _("Use global settings"));
+
+       hbox2 = gtk_hbox_new(FALSE, 8);
+       gtk_box_pack_start(GTK_BOX(vbox4), hbox2, FALSE, FALSE, 0);
+
+       PACK_CHECK_BUTTON(hbox2, autochk_checkbtn,
+                       _("Check for new mail every"));
+
+       adj = gtk_adjustment_new(5, 0, 99, 1, 10, 0);
+       autochk_hour_spinbtn = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);
+       gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(autochk_hour_spinbtn), TRUE);
+       gtk_box_pack_start(GTK_BOX(hbox2), autochk_hour_spinbtn, FALSE, FALSE, 0);
+       autochk_hour_label = gtk_label_new(_("hours"));
+       gtk_box_pack_start(GTK_BOX(hbox2), autochk_hour_label, FALSE, FALSE, 0);
+
+       adj = gtk_adjustment_new(5, 0, 99, 1, 10, 0);
+       autochk_min_spinbtn = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);
+       gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(autochk_min_spinbtn), TRUE);
+       gtk_box_pack_start(GTK_BOX(hbox2), autochk_min_spinbtn, FALSE, FALSE, 0);
+       autochk_min_label = gtk_label_new(_("minutes"));
+       gtk_box_pack_start(GTK_BOX(hbox2), autochk_min_label, FALSE, FALSE, 0);
+
+       adj = gtk_adjustment_new(5, 0, 99, 1, 10, 0);
+       autochk_sec_spinbtn = gtk_spin_button_new(GTK_ADJUSTMENT(adj), 1, 0);
+       gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(autochk_sec_spinbtn), TRUE);
+       gtk_box_pack_start(GTK_BOX(hbox2), autochk_sec_spinbtn, FALSE, FALSE, 0);
+       autochk_sec_label = gtk_label_new(_("seconds"));
+       gtk_box_pack_start(GTK_BOX(hbox2), autochk_sec_label, FALSE, FALSE, 0);
+
+       autochk_widgets = g_new0(struct AutocheckWidgets, 1);
+       autochk_widgets->autochk_hour_spinbtn = autochk_hour_spinbtn;
+       autochk_widgets->autochk_min_spinbtn = autochk_min_spinbtn;
+       autochk_widgets->autochk_sec_spinbtn = autochk_sec_spinbtn;
+
+       gtk_widget_show_all(vbox4);
+
+       SET_TOGGLE_SENSITIVITY_REVERSE(autochk_use_default_checkbtn, hbox2);
+       SET_TOGGLE_SENSITIVITY(autochk_checkbtn, autochk_hour_spinbtn);
+       SET_TOGGLE_SENSITIVITY(autochk_checkbtn, autochk_min_spinbtn);
+       SET_TOGGLE_SENSITIVITY(autochk_checkbtn, autochk_sec_spinbtn);
+       SET_TOGGLE_SENSITIVITY(autochk_checkbtn, autochk_hour_label);
+       SET_TOGGLE_SENSITIVITY(autochk_checkbtn, autochk_min_label);
+       SET_TOGGLE_SENSITIVITY(autochk_checkbtn, autochk_sec_label);
+
        PACK_CHECK_BUTTON (vbox1, filter_on_recv_checkbtn,
                           _("Filter messages on receiving"));
 
        g_signal_connect(G_OBJECT(filter_on_recv_checkbtn), "toggled",
                         G_CALLBACK(prefs_account_filter_on_recv_toggled),
                         NULL);
+       g_signal_connect(G_OBJECT(autochk_hour_spinbtn), "value-changed",
+               G_CALLBACK(prefs_account_receive_itv_spinbutton_value_changed_cb),
+               (gpointer) page);
+       g_signal_connect(G_OBJECT(autochk_min_spinbtn), "value-changed",
+               G_CALLBACK(prefs_account_receive_itv_spinbutton_value_changed_cb),
+               (gpointer) page);
+       g_signal_connect(G_OBJECT(autochk_sec_spinbtn), "value-changed",
+               G_CALLBACK(prefs_account_receive_itv_spinbutton_value_changed_cb),
+               (gpointer) page);
 
        PACK_CHECK_BUTTON (vbox1, filterhook_on_recv_checkbtn,
                           _("Allow filtering using plugins on receiving"));
@@ -1750,6 +1837,8 @@ static void receive_create_widget_func(PrefsPage * _page,
        page->inbox_entry              = inbox_entry;
        page->inbox_btn                = inbox_btn;
 
+       page->autochk_frame            = frame;
+
        page->imap_frame               = imap_frame;
        page->imap_auth_type_optmenu   = optmenu;
 
@@ -1768,6 +1857,10 @@ static void receive_create_widget_func(PrefsPage * _page,
        page->maxarticle_spinbtn        = maxarticle_spinbtn;
        page->maxarticle_spinbtn_adj    = maxarticle_spinbtn_adj;
 
+       page->autochk_checkbtn = autochk_checkbtn;
+       page->autochk_widgets = autochk_widgets;
+       page->autochk_use_default_checkbtn = autochk_use_default_checkbtn;
+
        tmp_ac_prefs = *ac_prefs;
 
        if (new_account) {
@@ -2786,7 +2879,7 @@ static void proxy_create_widget_func(PrefsPage * _page,
        GtkWidget *proxy_frame;
        GtkWidget *proxy_checkbtn;
        GtkWidget *default_proxy_checkbtn;
-       GtkWidget *hbox2;
+       GtkWidget *hbox;
        GtkWidget *label;
        GtkWidget *socks4_radiobtn;
        GtkWidget *socks5_radiobtn;
@@ -2796,6 +2889,8 @@ static void proxy_create_widget_func(PrefsPage * _page,
        GtkWidget *proxy_name_entry;
        GtkWidget *proxy_pass_entry;
        GtkWidget *proxy_send_checkbtn;
+       GtkWidget *table;
+       GtkWidget *button;
        gchar *buf;
 
        vbox1 = gtk_vbox_new (FALSE, VSPACING);
@@ -2818,56 +2913,72 @@ static void proxy_create_widget_func(PrefsPage * _page,
        vbox3 = gtk_vbox_new (FALSE, VSPACING_NARROW);
        gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
 
-       hbox2 = gtk_hbox_new (FALSE, 8);
-       gtk_box_pack_start (GTK_BOX (vbox3), hbox2, FALSE, FALSE, 0);
+       hbox = gtk_hbox_new (FALSE, 8);
+       gtk_box_pack_start (GTK_BOX (vbox3), hbox, FALSE, FALSE, 0);
 
        socks4_radiobtn = gtk_radio_button_new_with_label(NULL, "SOCKS4");
-       gtk_box_pack_start (GTK_BOX (hbox2), socks4_radiobtn, FALSE, FALSE, 0);
+       gtk_box_pack_start (GTK_BOX (hbox), socks4_radiobtn, FALSE, FALSE, 0);
        g_object_set_data(G_OBJECT(socks4_radiobtn), MENU_VAL_ID,
                          GINT_TO_POINTER(PROXY_SOCKS4));
 
-       CREATE_RADIO_BUTTON(hbox2, socks5_radiobtn, socks4_radiobtn, "SOCKS5",
+       CREATE_RADIO_BUTTON(hbox, socks5_radiobtn, socks4_radiobtn, "SOCKS5",
                            PROXY_SOCKS5);
 
-       hbox2 = gtk_hbox_new (FALSE, 8);
-       gtk_box_pack_start (GTK_BOX (vbox3), hbox2, FALSE, FALSE, 0);
+       hbox = gtk_hbox_new (FALSE, 8);
+       gtk_box_pack_start (GTK_BOX (vbox3), hbox, FALSE, FALSE, 0);
 
        label = gtk_label_new(_("Hostname"));
-       gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
 
        proxy_host_entry = gtk_entry_new();
        gtk_widget_set_size_request(proxy_host_entry, DEFAULT_ENTRY_WIDTH, -1);
-       gtk_box_pack_start(GTK_BOX(hbox2), proxy_host_entry, TRUE, TRUE, 0);
+       gtk_box_pack_start(GTK_BOX(hbox), proxy_host_entry, TRUE, TRUE, 0);
 
        label = gtk_label_new(_("Port"));
-       gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
 
        proxy_port_spinbtn = gtk_spin_button_new_with_range(0, 65535, 1080);
        gtk_widget_set_size_request(proxy_port_spinbtn, 64, -1);
-       gtk_box_pack_start(GTK_BOX(hbox2), proxy_port_spinbtn, FALSE, FALSE, 0);
+       gtk_box_pack_start(GTK_BOX(hbox), proxy_port_spinbtn, FALSE, FALSE, 0);
 
        vbox4 = gtk_vbox_new (FALSE, VSPACING_NARROW);
        gtk_box_pack_start(GTK_BOX(vbox3), vbox4, FALSE, FALSE, 0);
 
        PACK_CHECK_BUTTON (vbox4, proxy_auth_checkbtn, _("Use authentication"));
 
-       hbox2 = gtk_hbox_new (FALSE, 8);
-       gtk_box_pack_start (GTK_BOX (vbox4), hbox2, FALSE, FALSE, 0);
+       table = gtk_table_new(2, 4, FALSE);
+       gtk_box_pack_start (GTK_BOX (vbox4), table, FALSE, FALSE, 0);
 
        label = gtk_label_new(_("Username"));
-       gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
+       gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1,
+                       GTK_SHRINK | GTK_FILL,
+                       GTK_SHRINK | GTK_FILL, 0, 0);
 
        proxy_name_entry = gtk_entry_new();
        gtk_widget_set_size_request(proxy_name_entry, DEFAULT_ENTRY_WIDTH, -1);
-       gtk_box_pack_start(GTK_BOX(hbox2), proxy_name_entry, TRUE, TRUE, 0);
+       gtk_table_attach(GTK_TABLE(table), proxy_name_entry, 1, 2, 0, 1,
+                       GTK_EXPAND | GTK_SHRINK | GTK_FILL,
+                       GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
 
        label = gtk_label_new(_("Password"));
-       gtk_box_pack_start(GTK_BOX(hbox2), label, FALSE, FALSE, 0);
+       gtk_table_attach(GTK_TABLE(table), label, 2, 3, 0, 1,
+                       GTK_SHRINK | GTK_FILL,
+                       GTK_SHRINK | GTK_FILL, 0, 0);
 
        proxy_pass_entry = gtk_entry_new();
        gtk_widget_set_size_request(proxy_pass_entry, DEFAULT_ENTRY_WIDTH, -1);
        gtk_entry_set_visibility(GTK_ENTRY(proxy_pass_entry), FALSE);
-       gtk_box_pack_start(GTK_BOX(hbox2), proxy_pass_entry, TRUE, TRUE, 0);
+       gtk_table_attach(GTK_TABLE(table), proxy_pass_entry, 3, 4, 0, 1,
+                       GTK_EXPAND | GTK_SHRINK | GTK_FILL,
+                       GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
+
+       button = gtk_check_button_new_with_label(_("Show password"));
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), FALSE);
+       gtk_table_attach(GTK_TABLE(table), button, 3, 4, 1, 2,
+                       GTK_SHRINK | GTK_FILL,
+                       GTK_SHRINK | GTK_FILL, 0, 0);
+       g_signal_connect(G_OBJECT(button), "toggled",
+                       G_CALLBACK(prefs_account_showpwd_checkbtn_toggled), proxy_pass_entry);
 
        gtk_box_pack_start(GTK_BOX(vbox2), gtk_hseparator_new(), FALSE, FALSE, 0);
 
@@ -2876,7 +2987,7 @@ static void proxy_create_widget_func(PrefsPage * _page,
        CLAWS_SET_TIP(proxy_send_checkbtn,
                        _("If disabled, messages will be sent using direct connection to configured outgoing server, bypassing any configured proxy server."));
 
-       SET_TOGGLE_SENSITIVITY(proxy_auth_checkbtn, hbox2);
+       SET_TOGGLE_SENSITIVITY(proxy_auth_checkbtn, table);
        SET_TOGGLE_SENSITIVITY(socks5_radiobtn, vbox4);
        SET_TOGGLE_SENSITIVITY(proxy_checkbtn, vbox2);
        SET_TOGGLE_SENSITIVITY_REVERSE(default_proxy_checkbtn, vbox3);
@@ -2942,11 +3053,9 @@ static void advanced_create_widget_func(PrefsPage * _page,
        GtkWidget *checkbtn_domain;
        GtkWidget *entry_domain;
        gchar *tip_domain;
-#if !GTK_CHECK_VERSION(3, 0, 0)
        GtkWidget *checkbtn_crosspost;
        GtkWidget *colormenu_crosspost;
        GtkWidget *menu;
-#endif
 #ifndef G_OS_WIN32
        GtkWidget *checkbtn_tunnelcmd;
        GtkWidget *entry_tunnelcmd;
@@ -3038,7 +3147,7 @@ static void advanced_create_widget_func(PrefsPage * _page,
        SET_TOGGLE_SENSITIVITY (checkbtn_tunnelcmd, entry_tunnelcmd);
 #endif
 
-#if !GTK_CHECK_VERSION(3, 0, 0)
+       PACK_HBOX (hbox1);
        PACK_CHECK_BUTTON (hbox1, checkbtn_crosspost, 
                           _("Mark cross-posted messages as read and color:"));
        g_signal_connect (G_OBJECT (checkbtn_crosspost), "toggled",
@@ -3052,9 +3161,6 @@ static void advanced_create_widget_func(PrefsPage * _page,
        menu = colorlabel_create_color_menu();
        gtk_cmoption_menu_set_menu (GTK_CMOPTION_MENU(colormenu_crosspost), menu);
        SET_TOGGLE_SENSITIVITY(checkbtn_crosspost, colormenu_crosspost);
-#endif
-
-       PACK_HBOX (hbox1);
 #undef PACK_HBOX
 #undef PACK_PORT_SPINBTN
 
@@ -3118,10 +3224,8 @@ static void advanced_create_widget_func(PrefsPage * _page,
        page->nntpport_spinbtn          = spinbtn_nntpport;
        page->domain_checkbtn           = checkbtn_domain;
        page->domain_entry              = entry_domain;
-#if !GTK_CHECK_VERSION(3, 0, 0)
        page->crosspost_checkbtn        = checkbtn_crosspost;
        page->crosspost_colormenu       = colormenu_crosspost;
-#endif
 
 #ifndef G_OS_WIN32
        page->tunnelcmd_checkbtn        = checkbtn_tunnelcmd;
@@ -3279,6 +3383,7 @@ static gint prefs_receive_apply(void)
        }
 
        prefs_set_data_from_dialog(receive_param);
+
        return 0;
 }
 
@@ -3347,6 +3452,32 @@ static gint prefs_proxy_apply(void)
 
 static gint prefs_advanced_apply(void)
 {
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.domain_checkbtn)) &&
+           *gtk_entry_get_text(GTK_ENTRY(advanced_page.domain_entry)) == '\0') {
+               alertpanel_error(_("domain is not specified."));
+               return -1;
+       }
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.sent_folder_checkbtn)) &&
+           *gtk_entry_get_text(GTK_ENTRY(advanced_page.sent_folder_entry)) == '\0') {
+               alertpanel_error(_("sent folder is not selected."));
+               return -1;
+       }
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.queue_folder_checkbtn)) &&
+           *gtk_entry_get_text(GTK_ENTRY(advanced_page.queue_folder_entry)) == '\0') {
+               alertpanel_error(_("queue folder is not selected."));
+               return -1;
+       }
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.draft_folder_checkbtn)) &&
+           *gtk_entry_get_text(GTK_ENTRY(advanced_page.draft_folder_entry)) == '\0') {
+               alertpanel_error(_("draft folder is not selected."));
+               return -1;
+       }
+       if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(advanced_page.trash_folder_checkbtn)) &&
+           *gtk_entry_get_text(GTK_ENTRY(advanced_page.trash_folder_entry)) == '\0') {
+               alertpanel_error(_("trash folder is not selected."));
+               return -1;
+       }
+
        prefs_set_data_from_dialog(advanced_param);
        return 0;
 }
@@ -3985,6 +4116,12 @@ PrefsAccount *prefs_account_new_from_config(const gchar *label)
 
        prefs_custom_header_read_config(ac_prefs);
 
+       /* Start the auto-check interval, if needed. */
+       if (!ac_prefs->autochk_use_default && ac_prefs->autochk_use_custom
+                       && ac_prefs->autochk_itv > PREFS_RECV_AUTOCHECK_MIN_INTERVAL) {
+               inc_account_autocheck_timer_set_interval(ac_prefs);
+       }
+
        return ac_prefs;
 }
 
@@ -4051,8 +4188,8 @@ void prefs_account_write_config_all(GList *account_list)
                privacy_prefs = NULL;
 
                if (cur->next) {
-                       if (fputc('\n', pfile->fp) == EOF) {
-                               FILE_OP_ERROR(rcpath, "fputc");
+                       if (claws_fputc('\n', pfile->fp) == EOF) {
+                               FILE_OP_ERROR(rcpath, "claws_fputc");
                                prefs_file_close_revert(pfile);
                                return;
                        }
@@ -4141,6 +4278,9 @@ static void destroy_dialog(gpointer data)
                *ac_prefs = tmp_ac_prefs;
                if (update_fld_list)
                        folderview_rescan_tree(ac_prefs->folder, FALSE);
+
+               inc_account_autocheck_timer_set_interval(ac_prefs);
+
        } else /* the customhdr_list may have changed, update it anyway */
                ac_prefs->customhdr_list = (&tmp_ac_prefs)->customhdr_list;
 
@@ -4197,7 +4337,6 @@ PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs, gboolean *dirty)
        }
 }
 
-#if !GTK_CHECK_VERSION(3, 0, 0)
 static void crosspost_color_toggled(void)
 {
        gboolean is_active;
@@ -4230,7 +4369,6 @@ static void prefs_account_crosspost_set_colormenu(PrefParam *pparam)
        menuitem = gtk_menu_get_active(GTK_MENU(menu));
        gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
 }
-#endif
 
 static void pop_bfr_smtp_tm_set_sens(GtkWidget *widget, gpointer data)
 {
@@ -4428,7 +4566,7 @@ static void prefs_account_signature_edit_cb(GtkWidget *widget, gpointer data)
 {
        const gchar *sigpath = gtk_entry_get_text(GTK_ENTRY(data));
        if (!is_file_exist(sigpath))
-               str_write_to_file(sigpath, "");
+               str_write_to_file(sigpath, "", TRUE);
        open_txt_editor(sigpath, prefs_common_get_ext_editor_cmd());
 }
 
@@ -4563,6 +4701,37 @@ static void prefs_account_smtp_auth_type_set_optmenu(PrefParam *pparam)
        combobox_select_by_data(optmenu, type);
 }
 
+static void prefs_account_set_autochk_interval_from_widgets(PrefParam *pparam)
+{
+       struct AutocheckWidgets *autochk_widgets =
+               (struct AutocheckWidgets *)*pparam->widget;
+
+       *(gint *)pparam->data =
+               (3600 * gtk_spin_button_get_value_as_int(
+                       GTK_SPIN_BUTTON(autochk_widgets->autochk_hour_spinbtn)))
+               + (60 * gtk_spin_button_get_value_as_int(
+                       GTK_SPIN_BUTTON(autochk_widgets->autochk_min_spinbtn)))
+               + gtk_spin_button_get_value_as_int(
+                       GTK_SPIN_BUTTON(autochk_widgets->autochk_sec_spinbtn));
+}
+
+static void prefs_account_set_autochk_interval_to_widgets(PrefParam *pparam)
+{
+       gint val = *((gint *)pparam->data);
+       struct AutocheckWidgets *autochk_widgets =
+               (struct AutocheckWidgets *)*pparam->widget;
+
+       gtk_spin_button_set_value(
+                       GTK_SPIN_BUTTON(autochk_widgets->autochk_hour_spinbtn),
+                       val / 3600);
+       gtk_spin_button_set_value(
+                       GTK_SPIN_BUTTON(autochk_widgets->autochk_min_spinbtn),
+                       (val % 3600) / 60);
+       gtk_spin_button_set_value(
+                       GTK_SPIN_BUTTON(autochk_widgets->autochk_sec_spinbtn),
+                       (val % 3600) % 60);
+}
+
 static void prefs_account_set_string_from_combobox(PrefParam *pparam)
 {
        GtkWidget *combobox;
@@ -4735,6 +4904,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(receive_page.pop3_frame);
                gtk_widget_hide(receive_page.imap_frame);
                gtk_widget_hide(receive_page.local_frame);
+               gtk_widget_show(receive_page.autochk_frame);
                gtk_widget_show(receive_page.frame_maxarticle);
                gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, TRUE);
                prefs_account_filter_on_recv_toggled
@@ -4767,10 +4937,8 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(advanced_page.popport_hbox);
                gtk_widget_hide(advanced_page.imapport_hbox);
                gtk_widget_show(advanced_page.nntpport_hbox);
-#if !GTK_CHECK_VERSION(3, 0, 0)
                gtk_widget_show(advanced_page.crosspost_checkbtn);
                gtk_widget_show(advanced_page.crosspost_colormenu);
-#endif
 #ifndef G_OS_WIN32
                gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
                gtk_widget_hide(advanced_page.tunnelcmd_entry);
@@ -4831,6 +4999,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(receive_page.pop3_frame);
                gtk_widget_hide(receive_page.imap_frame);
                gtk_widget_show(receive_page.local_frame);
+               gtk_widget_show(receive_page.autochk_frame);
                gtk_widget_hide(receive_page.frame_maxarticle);
                gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, TRUE);
                prefs_account_filter_on_recv_toggled
@@ -4866,10 +5035,8 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(advanced_page.popport_hbox);
                gtk_widget_hide(advanced_page.imapport_hbox);
                gtk_widget_hide(advanced_page.nntpport_hbox);
-#if !GTK_CHECK_VERSION(3, 0, 0)
                gtk_widget_hide(advanced_page.crosspost_checkbtn);
                gtk_widget_hide(advanced_page.crosspost_colormenu);
-#endif
 #ifndef G_OS_WIN32
                gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
                gtk_widget_hide(advanced_page.tunnelcmd_entry);
@@ -4939,6 +5106,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(receive_page.pop3_frame);
                gtk_widget_show(receive_page.imap_frame);
                gtk_widget_hide(receive_page.local_frame);
+               gtk_widget_show(receive_page.autochk_frame);
                gtk_widget_hide(receive_page.frame_maxarticle);
                gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, TRUE);
                prefs_account_filter_on_recv_toggled
@@ -4974,10 +5142,8 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(advanced_page.popport_hbox);
                gtk_widget_show(advanced_page.imapport_hbox);
                gtk_widget_hide(advanced_page.nntpport_hbox);
-#if !GTK_CHECK_VERSION(3, 0, 0)
                gtk_widget_hide(advanced_page.crosspost_checkbtn);
                gtk_widget_hide(advanced_page.crosspost_colormenu);
-#endif
 #ifndef G_OS_WIN32
                gtk_widget_show(advanced_page.tunnelcmd_checkbtn);
                gtk_widget_show(advanced_page.tunnelcmd_entry);
@@ -5042,6 +5208,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(receive_page.pop3_frame);
                gtk_widget_hide(receive_page.imap_frame);
                gtk_widget_hide(receive_page.local_frame);
+               gtk_widget_hide(receive_page.autochk_frame);
                gtk_widget_hide(receive_page.frame_maxarticle);
                gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, FALSE);
                prefs_account_filter_on_recv_toggled
@@ -5071,10 +5238,8 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_hide(advanced_page.popport_hbox);
                gtk_widget_hide(advanced_page.imapport_hbox);
                gtk_widget_hide(advanced_page.nntpport_hbox);
-#if !GTK_CHECK_VERSION(3, 0, 0)
                gtk_widget_hide(advanced_page.crosspost_checkbtn);
                gtk_widget_hide(advanced_page.crosspost_colormenu);
-#endif
 #ifndef G_OS_WIN32
                gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
                gtk_widget_hide(advanced_page.tunnelcmd_entry);
@@ -5141,6 +5306,7 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_show(receive_page.pop3_frame);
                gtk_widget_hide(receive_page.imap_frame);
                gtk_widget_hide(receive_page.local_frame);
+               gtk_widget_show(receive_page.autochk_frame);
                gtk_widget_hide(receive_page.frame_maxarticle);
                gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, TRUE);
                prefs_account_filter_on_recv_toggled
@@ -5175,10 +5341,8 @@ static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
                gtk_widget_show(advanced_page.popport_hbox);
                gtk_widget_hide(advanced_page.imapport_hbox);
                gtk_widget_hide(advanced_page.nntpport_hbox);
-#if !GTK_CHECK_VERSION(3, 0, 0)
                gtk_widget_hide(advanced_page.crosspost_checkbtn);
                gtk_widget_hide(advanced_page.crosspost_colormenu);
-#endif
 #ifndef G_OS_WIN32
                gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
                gtk_widget_hide(advanced_page.tunnelcmd_entry);
@@ -5237,14 +5401,9 @@ static void prefs_account_showpwd_checkbtn_toggled(GtkToggleButton *button,
 static void prefs_account_entry_changed_newline_check_cb(GtkWidget *entry,
                gpointer user_data)
 {
-#if !GTK_CHECK_VERSION(3, 0, 0)
        static GdkColor red;
        static gboolean colors_initialised = FALSE;
-#else
-       static GdkColor red = { (guint32)0, (guint16)0xff, (guint16)0x70, (guint16)0x70 };
-#endif
 
-#if !GTK_CHECK_VERSION(3, 0, 0)
        if (strchr(gtk_entry_get_text(GTK_ENTRY(entry)), '\n') != NULL) {
                /* Entry contains a newline, light it up. */
                debug_print("found newline in string, painting entry red\n");
@@ -5263,7 +5422,6 @@ static void prefs_account_entry_changed_newline_check_cb(GtkWidget *entry,
        } else {
                gtk_widget_modify_base(entry, GTK_STATE_NORMAL, NULL);
        }
-#endif
 }
 
 static void prefs_account_filter_on_recv_toggled(GtkToggleButton *button,
@@ -5422,3 +5580,19 @@ gchar *prefs_account_cache_dir(PrefsAccount *ac_prefs, gboolean for_server)
 
        return dir;
 }
+
+static void prefs_account_receive_itv_spinbutton_value_changed_cb(GtkWidget *w, gpointer data)
+{
+       ReceivePage *page = (ReceivePage *)data;
+       gint seconds = gtk_spin_button_get_value_as_int (
+               GTK_SPIN_BUTTON (page->autochk_widgets->autochk_sec_spinbtn));
+       gint minutes = gtk_spin_button_get_value_as_int (
+               GTK_SPIN_BUTTON (page->autochk_widgets->autochk_min_spinbtn));
+       gint hours = gtk_spin_button_get_value_as_int (
+               GTK_SPIN_BUTTON(page->autochk_widgets->autochk_hour_spinbtn));
+       if (seconds < PREFS_RECV_AUTOCHECK_MIN_INTERVAL && minutes == 0 && hours == 0) {
+               gtk_spin_button_set_value (
+                       GTK_SPIN_BUTTON (page->autochk_widgets->autochk_sec_spinbtn),
+                               PREFS_RECV_AUTOCHECK_MIN_INTERVAL);
+       }
+}