2005-10-10 [colin] 1.9.15cvs28
[claws.git] / src / main.c
index a4d531c1cead05254a0e747eabf25386cc61e81f..e54d2ed37137cd8bd8f1d9dcf4e758cbef94e345 100644 (file)
@@ -14,7 +14,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
 #ifdef HAVE_CONFIG_H
@@ -36,7 +36,9 @@
 #include <time.h>
 #include <sys/stat.h>
 #include <sys/types.h>
-#include <signal.h>
+#ifdef G_OS_UNIX
+#  include <signal.h>
+#endif
 #include "wizard.h"
 #ifdef HAVE_STARTUP_NOTIFICATION
 # define SN_API_NOT_YET_FROZEN
@@ -89,7 +91,7 @@
 #include "imap_gtk.h"
 #include "news_gtk.h"
 #include "matcher.h"
-#ifdef USE_LIBETPAN
+#ifdef HAVE_LIBETPAN
 #include "imap-thread.h"
 #endif
 #include "stock_pixmap.h"
@@ -166,7 +168,7 @@ static void exit_sylpheed           (MainWindow *mainwin);
        if (!is_dir_exist(dir)) { \
                if (is_file_exist(dir)) { \
                        alertpanel_warning \
-                               (_("File `%s' already exists.\n" \
+                               (_("File '%s' already exists.\n" \
                                   "Can't create folder."), \
                                 dir); \
                        return 1; \
@@ -224,6 +226,24 @@ void sylpheed_gtk_idle(void)
 {
        while(gtk_events_pending())
                gtk_main_iteration();
+       usleep(50000);
+}
+
+gboolean defer_check_all(void *data)
+{
+       gboolean autochk = GPOINTER_TO_INT(data);
+
+       inc_all_account_mail(static_mainwindow, autochk, 
+                       prefs_common.newmail_notify_manu);
+
+       return FALSE;
+}
+
+gboolean defer_check(void *data)
+{
+       inc_mail(static_mainwindow, prefs_common.newmail_notify_manu);
+
+       return FALSE;
 }
 
 int main(int argc, char *argv[])
@@ -232,6 +252,7 @@ int main(int argc, char *argv[])
        MainWindow *mainwin;
        FolderView *folderview;
        GdkPixbuf *icon;
+       gboolean crash_file_present = FALSE;
 
        if (!sylpheed_init(&argc, &argv)) {
                return 0;
@@ -254,8 +275,10 @@ int main(int argc, char *argv[])
        crash_install_handlers();
 #endif
        install_basic_sighandlers();
+       sock_init();
 
-       /* check and create unix domain socket */
+       /* check and create unix domain socket for remote operation */
+#ifdef G_OS_UNIX
        lock_socket = prohibit_duplicate_launch();
        if (lock_socket < 0) {
 #ifdef HAVE_STARTUP_NOTIFICATION
@@ -270,7 +293,7 @@ int main(int argc, char *argv[])
                lock_socket_remove();
                return 0;
        }
-
+#endif
        g_thread_init(NULL);
        /* gdk_threads_init(); */
 
@@ -278,7 +301,7 @@ int main(int argc, char *argv[])
        gtk_init(&argc, &argv);
 
        gdk_rgb_init();
-       gtk_widget_set_default_colormap(gdk_rgb_get_cmap());
+       gtk_widget_set_default_colormap(gdk_rgb_get_colormap());
        gtk_widget_set_default_visual(gdk_rgb_get_visual());
 
        if (!g_thread_supported())
@@ -308,13 +331,27 @@ int main(int argc, char *argv[])
        CHDIR_RETURN_VAL_IF_FAIL(get_home_dir(), 1);
 
        MAKE_DIR_IF_NOT_EXIST(RC_DIR);
+
+       CHDIR_RETURN_VAL_IF_FAIL(get_rc_dir(), 1);
+
        MAKE_DIR_IF_NOT_EXIST(get_imap_cache_dir());
        MAKE_DIR_IF_NOT_EXIST(get_news_cache_dir());
        MAKE_DIR_IF_NOT_EXIST(get_mime_tmp_dir());
        MAKE_DIR_IF_NOT_EXIST(get_tmp_dir());
-       MAKE_DIR_IF_NOT_EXIST(RC_DIR G_DIR_SEPARATOR_S "uidl");
+       MAKE_DIR_IF_NOT_EXIST(UIDL_DIR);
 
-       set_log_file(RC_DIR G_DIR_SEPARATOR_S "sylpheed.log");
+       crash_file_present = is_file_exist(get_crashfile_name());
+       /* remove temporary files */
+       remove_all_files(get_tmp_dir());
+       remove_all_files(get_mime_tmp_dir());
+
+       if (is_file_exist("sylpheed.log")) {
+               if (rename_force("sylpheed.log", "sylpheed.log.bak") < 0)
+                       FILE_OP_ERROR("sylpheed.log", "rename");
+       }
+       set_log_file("sylpheed.log");
+
+       CHDIR_RETURN_VAL_IF_FAIL(get_home_dir(), 1);
 
        folder_system_init();
        prefs_common_read_config();
@@ -339,7 +376,7 @@ int main(int argc, char *argv[])
 #endif
        
        sock_set_io_timeout(prefs_common.io_timeout_secs);
-#ifdef USE_LIBETPAN
+#ifdef HAVE_LIBETPAN
        imap_main_set_timeout(prefs_common.io_timeout_secs);
 #endif
        prefs_actions_read_config();
@@ -353,6 +390,7 @@ int main(int argc, char *argv[])
        gtk_window_set_default_icon(icon);
 
        folderview_initialize();
+
        mh_gtk_init();
        imap_gtk_init();
        news_gtk_init();
@@ -361,11 +399,16 @@ int main(int argc, char *argv[])
                (prefs_common.sep_folder | prefs_common.sep_msg << 1);
        folderview = mainwin->folderview;
 
+       gtk_clist_freeze(GTK_CLIST(mainwin->folderview->ctree));
+       folder_item_update_freeze();
+
        /* register the callback of unix domain socket input */
+#ifdef G_OS_UNIX
        lock_socket_tag = gdk_input_add(lock_socket,
                                        GDK_INPUT_READ | GDK_INPUT_EXCEPTION,
                                        lock_socket_input_cb,
                                        mainwin);
+#endif
 
        prefs_account_init();
        account_read_config_all();
@@ -384,7 +427,7 @@ int main(int argc, char *argv[])
                        exit_sylpheed(mainwin);
        }
 
-#ifdef USE_LIBETPAN
+#ifdef HAVE_LIBETPAN
        imap_main_init();
 #endif 
        account_set_missing_folder();
@@ -396,12 +439,12 @@ int main(int argc, char *argv[])
        /* make one all-folder processing before using sylpheed */
        main_window_cursor_wait(mainwin);
        folder_func_to_all_folders(initial_processing, (gpointer *)mainwin);
-       main_window_cursor_normal(mainwin);
 
        /* if Sylpheed crashed, rebuild caches */
-       if (!cmd.crash && is_file_exist(get_crashfile_name())) {
+       if (!cmd.crash && crash_file_present) {
                debug_print("Sylpheed crashed, checking for new messages in local folders\n");
                folderview_check_new(NULL);
+               folder_clean_cache_memory_force();
        }
        /* make the crash-indicator file */
        str_write_to_file("foo", get_crashfile_name());
@@ -411,12 +454,13 @@ int main(int argc, char *argv[])
        inc_autocheck_timer_init(mainwin);
 
        /* ignore SIGPIPE signal for preventing sudden death of program */
+#ifdef G_OS_UNIX
        signal(SIGPIPE, SIG_IGN);
-
+#endif
        if (cmd.online_mode == ONLINE_MODE_OFFLINE)
-               main_window_toggle_work_offline(mainwin, TRUE);
+               main_window_toggle_work_offline(mainwin, TRUE, FALSE);
        if (cmd.online_mode == ONLINE_MODE_ONLINE)
-               main_window_toggle_work_offline(mainwin, FALSE);
+               main_window_toggle_work_offline(mainwin, FALSE, FALSE);
 
        if (cmd.status_folders) {
                g_ptr_array_free(cmd.status_folders, TRUE);
@@ -438,15 +482,16 @@ int main(int argc, char *argv[])
 #ifdef HAVE_STARTUP_NOTIFICATION
        startup_notification_complete(FALSE);
 #endif
+       folder_item_update_thaw();
+       gtk_clist_thaw(GTK_CLIST(mainwin->folderview->ctree));
+       main_window_cursor_normal(mainwin);
 
        if (cmd.receive_all)
-               inc_all_account_mail(mainwin, FALSE, 
-                                    prefs_common.newmail_notify_manu);
+               g_timeout_add(1000, defer_check_all, GINT_TO_POINTER(FALSE));
        else if (prefs_common.chk_on_startup)
-               inc_all_account_mail(mainwin, TRUE, 
-                                    prefs_common.newmail_notify_manu);
+               g_timeout_add(1000, defer_check_all, GINT_TO_POINTER(TRUE));
        else if (cmd.receive)
-               inc_mail(mainwin, prefs_common.newmail_notify_manu);
+               g_timeout_add(1000, defer_check, NULL);
        else
                gtk_widget_grab_focus(folderview->ctree);
 
@@ -479,9 +524,6 @@ static void exit_sylpheed(MainWindow *mainwin)
        gchar *filename;
 
        debug_print("shutting down\n");
-#ifdef USE_LIBETPAN
-       imap_main_done();
-#endif
        inc_autocheck_timer_remove();
 
        if (prefs_common.clean_on_exit)
@@ -516,9 +558,12 @@ static void exit_sylpheed(MainWindow *mainwin)
 
        close_log_file();
 
+#ifdef HAVE_LIBETPAN
+       imap_main_done();
+#endif
        /* delete crashfile */
        if (!cmd.crash)
-               unlink(get_crashfile_name());
+               g_unlink(get_crashfile_name());
 
        lock_socket_remove();
 
@@ -740,11 +785,11 @@ gboolean clean_quit(gpointer data)
 void app_will_exit(GtkWidget *widget, gpointer data)
 {
        MainWindow *mainwin = data;
-       
+
        if (compose_get_compose_list()) {
                gint val = alertpanel(_("Really quit?"),
                               _("Composing message exists."),
-                              _("Draft them"), _("Discard them"), _("Don't quit"));
+                              _("_Save to Draft"), _("_Discard them"), _("Do_n't quit"));
                switch (val) {
                        case G_ALERTOTHER:
                                return;
@@ -753,7 +798,7 @@ void app_will_exit(GtkWidget *widget, gpointer data)
                        default:
                                draft_all_messages();
                }
-               
+
                manage_window_focus_in(mainwin->window, NULL, NULL);
        }
 
@@ -765,6 +810,9 @@ void app_will_exit(GtkWidget *widget, gpointer data)
                        return;
                manage_window_focus_in(mainwin->window, NULL, NULL);
        }
+
+       sock_cleanup();
+
        gtk_main_quit();
 }
 
@@ -782,7 +830,11 @@ gchar *get_socket_name(void)
        if (filename == NULL) {
                filename = g_strdup_printf("%s%csylpheed-%d",
                                           g_get_tmp_dir(), G_DIR_SEPARATOR,
+#if HAVE_GETUID
                                           getuid());
+#else
+                                          0);                                          
+#endif
        }
 
        return filename;
@@ -808,7 +860,7 @@ static gint prohibit_duplicate_launch(void)
        path = get_socket_name();
        uxsock = fd_connect_unix(path);
        if (uxsock < 0) {
-               unlink(path);
+               g_unlink(path);
                return fd_open_unix(path);
        }
 
@@ -889,6 +941,7 @@ static gint prohibit_duplicate_launch(void)
 
 static gint lock_socket_remove(void)
 {
+#ifdef G_OS_UNIX
        gchar *filename;
 
        if (lock_socket < 0) return -1;
@@ -897,7 +950,8 @@ static gint lock_socket_remove(void)
                gdk_input_remove(lock_socket_tag);
        fd_close(lock_socket);
        filename = get_socket_name();
-       unlink(filename);
+       g_unlink(filename);
+#endif
 
        return 0;
 }
@@ -961,9 +1015,9 @@ static void lock_socket_input_cb(gpointer data,
        } else if (!strncmp(buf, "send", 4)) {
                send_queue();
        } else if (!strncmp(buf, "online", 6)) {
-               main_window_toggle_work_offline(mainwin, FALSE);
+               main_window_toggle_work_offline(mainwin, FALSE, FALSE);
        } else if (!strncmp(buf, "offline", 7)) {
-               main_window_toggle_work_offline(mainwin, TRUE);
+               main_window_toggle_work_offline(mainwin, TRUE, FALSE);
        } else if (!strncmp(buf, "status-full", 11) ||
                   !strncmp(buf, "status", 6)) {
                gchar *status;