imported irssi.
[silc.git] / apps / irssi / src / fe-text / silc.c
diff --git a/apps/irssi/src/fe-text/silc.c b/apps/irssi/src/fe-text/silc.c
new file mode 100644 (file)
index 0000000..9112b56
--- /dev/null
@@ -0,0 +1,298 @@
+/*
+ irssi.c : irssi
+
+    Copyright (C) 1999-2000 Timo Sirainen
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    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
+*/
+
+#include "module.h"
+#include "module-formats.h"
+#include "args.h"
+#include "signals.h"
+#include "levels.h"
+#include "core.h"
+#include "settings.h"
+
+#include "printtext.h"
+#include "fe-common-core.h"
+#include "fe-common-silc.h"
+#include "themes.h"
+
+#include "screen.h"
+#include "gui-entry.h"
+#include "mainwindows.h"
+#include "gui-printtext.h"
+#include "gui-readline.h"
+#include "statusbar.h"
+#include "gui-windows.h"
+
+#include <signal.h>
+
+#ifdef HAVE_STATIC_PERL
+void perl_core_init(void);
+void perl_core_deinit(void);
+
+void fe_perl_init(void);
+void fe_perl_deinit(void);
+#endif
+
+void silc_init(void);
+void silc_deinit(void);
+
+void gui_expandos_init(void);
+void gui_expandos_deinit(void);
+
+void textbuffer_commands_init(void);
+void textbuffer_commands_deinit(void);
+
+void lastlog_init(void);
+void lastlog_deinit(void);
+
+void mainwindow_activity_init(void);
+void mainwindow_activity_deinit(void);
+
+void mainwindows_save_init(void);
+void mainwindows_save_deinit(void);
+
+static GMainLoop *main_loop;
+int quitting;
+
+static const char *firsttimer_text =
+       "Looks like this is the first time you run irssi.\n"
+       "This is just a reminder that you really should go read\n"
+       "startup-HOWTO if you haven't already. Irssi's default\n"
+       "settings aren't probably what you've used to, and you\n"
+       "shouldn't judge the whole client as crap based on them.\n\n"
+       "You can find startup-HOWTO and more irssi beginner info at\n"
+       "http://irssi.org/beginner/";
+static int display_firsttimer = FALSE;
+
+
+static void sig_exit(void)
+{
+       g_main_quit(main_loop);
+}
+
+/* redraw irssi's screen.. */
+void irssi_redraw(void)
+{
+       clear();
+       refresh();
+
+       /* windows */
+        mainwindows_redraw();
+       /* statusbar */
+       statusbar_redraw(NULL);
+       /* entry line */
+       gui_entry_redraw();
+}
+
+static void textui_init(void)
+{
+       static struct poptOption options[] = {
+               POPT_AUTOHELP
+               { NULL, '\0', 0, NULL }
+       };
+
+       args_register(options);
+
+       irssi_gui = IRSSI_GUI_TEXT;
+       core_init();
+       silc_init();
+       fe_common_core_init();
+       fe_common_silc_init();
+
+       theme_register(gui_text_formats);
+       signal_add("gui exit", (SIGNAL_FUNC) sig_exit);
+}
+
+static void textui_finish_init(void)
+{
+       quitting = FALSE;
+
+       screen_refresh_freeze();
+        textbuffer_init();
+        textbuffer_view_init();
+       textbuffer_commands_init();
+       gui_entry_init();
+       gui_expandos_init();
+       gui_printtext_init();
+       gui_readline_init();
+        lastlog_init();
+       mainwindows_init();
+       mainwindow_activity_init();
+       mainwindows_save_init();
+       gui_windows_init();
+       statusbar_init();
+
+       settings_check();
+
+       fe_common_core_finish_init();
+
+#ifdef HAVE_STATIC_PERL
+       perl_core_init();
+        fe_perl_init();
+#endif
+       signal_emit("irssi init finished", 0);
+
+       if (display_firsttimer) {
+               printtext_window(active_win, MSGLEVEL_CLIENTNOTICE,
+                                "%s", firsttimer_text);
+       }
+
+       screen_refresh_thaw();
+}
+
+static void textui_deinit(void)
+{
+       quitting = TRUE;
+       signal(SIGINT, SIG_DFL);
+
+        screen_refresh_freeze();
+       while (modules != NULL)
+               module_unload(modules->data);
+
+       signal_remove("gui exit", (SIGNAL_FUNC) sig_exit);
+
+        lastlog_deinit();
+       statusbar_deinit();
+       gui_printtext_deinit();
+       gui_readline_deinit();
+       gui_windows_deinit();
+       mainwindows_save_deinit();
+       mainwindow_activity_deinit();
+       mainwindows_deinit();
+       gui_expandos_deinit();
+       gui_entry_deinit();
+       textbuffer_commands_deinit();
+        textbuffer_view_deinit();
+        textbuffer_deinit();
+
+        screen_refresh_thaw();
+       deinit_screen();
+
+#ifdef HAVE_STATIC_PERL
+        fe_perl_deinit();
+        perl_core_deinit();
+#endif
+
+       theme_unregister();
+
+       fe_common_silc_deinit();
+       fe_common_core_deinit();
+       silc_deinit();
+       core_deinit();
+}
+
+static void check_oldcrap(void)
+{
+        FILE *f;
+       char *path, str[256];
+        int found;
+
+        /* check that default.theme is up-to-date */
+       path = g_strdup_printf("%s/.irssi/default.theme", g_get_home_dir());
+       f = fopen(path, "r+");
+       if (f == NULL) {
+               g_free(path);
+                return;
+       }
+        found = FALSE;
+       while (!found && fgets(str, sizeof(str), f) != NULL)
+                found = strstr(str, "abstracts = ") != NULL;
+       fclose(f);
+
+       if (found) {
+               g_free(path);
+               return;
+       }
+
+       printf("\nYou seem to have old default.theme in ~/.irssi/ directory.\n");
+        printf("Themeing system has changed a bit since last irssi release,\n");
+        printf("you should either delete your old default.theme or manually\n");
+        printf("merge it with the new default.theme.\n\n");
+       printf("Do you want to delete the old theme now? (Y/n)\n");
+
+       str[0] = '\0';
+       fgets(str, sizeof(str), stdin);
+       if (toupper(str[0]) == 'Y' || str[0] == '\n' || str[0] == '\0')
+                remove(path);
+       g_free(path);
+}
+
+static void check_files(void)
+{
+       struct stat statbuf;
+        char *path;
+
+        path = g_strdup_printf("%s/.irssi", g_get_home_dir());
+       if (stat(path, &statbuf) != 0) {
+               /* ~/.irssi doesn't exist, first time running irssi */
+               display_firsttimer = TRUE;
+       } else {
+                check_oldcrap();
+       }
+        g_free(path);
+}
+
+#ifdef WIN32
+static void winsock_init(void)
+{
+       WORD wVersionRequested;
+       WSADATA wsaData;
+
+       wVersionRequested = MAKEWORD(2, 2);
+
+       if (WSAStartup(wVersionRequested, &wsaData) != 0) {
+               printf("Error initializing winsock\n");
+               exit(1);
+       }
+}
+#endif
+
+int main(int argc, char **argv)
+{
+       check_files();
+#ifdef WIN32
+        winsock_init();
+#endif
+#ifdef HAVE_SOCKS
+       SOCKSinit(argv[0]);
+#endif
+#ifdef ENABLE_NLS
+       /* initialize the i18n stuff */
+       bindtextdomain(PACKAGE, LOCALEDIR);
+       textdomain(PACKAGE);
+#endif
+
+       textui_init();
+       args_execute(argc, argv);
+
+       if (!init_screen())
+               g_error("Can't initialize screen handling, quitting.\n");
+
+       textui_finish_init();
+       main_loop = g_main_new(TRUE);
+       g_main_run(main_loop);
+       g_main_destroy(main_loop);
+       textui_deinit();
+
+#ifdef MEM_DEBUG
+       ig_mem_profile();
+#endif
+
+       return 0;
+}