4 Copyright (C) 1999-2000, 2007 Timo Sirainen
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 #include "module-formats.h"
23 #include "modules-load.h"
31 #include "printtext.h"
32 #include "fe-common-core.h"
33 #include "fe-common-silc.h"
37 #include "gui-entry.h"
38 #include "mainwindows.h"
39 #include "gui-printtext.h"
40 #include "gui-readline.h"
41 #include "statusbar.h"
42 #include "gui-windows.h"
43 #include "irssi-version.h"
48 #ifdef HAVE_STATIC_PERL
49 void perl_core_init(void);
50 void perl_core_deinit(void);
52 void fe_perl_init(void);
53 void fe_perl_deinit(void);
57 void silc_deinit(void);
59 void gui_expandos_init(void);
60 void gui_expandos_deinit(void);
62 void textbuffer_commands_init(void);
63 void textbuffer_commands_deinit(void);
65 void lastlog_init(void);
66 void lastlog_deinit(void);
68 void mainwindow_activity_init(void);
69 void mainwindow_activity_deinit(void);
71 void mainwindows_layout_init(void);
72 void mainwindows_layout_deinit(void);
74 void term_dummy_init(void);
75 void term_dummy_deinit(void);
77 static int dirty, full_redraw, dummy;
79 static GMainLoop *main_loop;
82 static int display_firsttimer = FALSE;
84 static void sig_exit(void)
89 /* redraw irssi's screen.. */
90 void irssi_redraw(void)
96 void irssi_set_dirty(void)
101 static void dirty_check(void)
111 /* first clear the screen so curses will be
112 forced to redraw the screen */
116 mainwindows_redraw();
117 statusbar_redraw(NULL, TRUE);
120 mainwindows_redraw_dirty();
121 statusbar_redraw_dirty();
127 static void textui_init(void)
130 struct sigaction act;
132 sigemptyset(&act.sa_mask);
134 act.sa_handler = SIG_IGN;
135 sigaction(SIGTRAP, &act, NULL);
138 irssi_gui = IRSSI_GUI_TEXT;
141 fe_common_core_init();
144 theme_register(gui_text_formats);
145 signal_add_last("gui exit", (SIGNAL_FUNC) sig_exit);
148 static void textui_finish_init(void)
155 term_refresh_freeze();
157 textbuffer_view_init();
158 textbuffer_commands_init();
160 gui_printtext_init();
164 mainwindow_activity_init();
165 mainwindows_layout_init();
170 /* don't check settings with dummy mode */
174 module_register("core", "fe-text");
176 #ifdef HAVE_STATIC_PERL
183 fe_common_core_finish_init();
184 signal_emit("irssi init finished", 0);
187 static void textui_deinit(void)
189 signal(SIGINT, SIG_DFL);
191 term_refresh_freeze();
192 while (modules != NULL)
193 module_unload(modules->data);
195 #ifdef HAVE_STATIC_PERL
200 dirty_check(); /* one last time to print any quit messages */
201 signal_remove("gui exit", (SIGNAL_FUNC) sig_exit);
208 gui_printtext_deinit();
209 gui_readline_deinit();
210 gui_windows_deinit();
211 mainwindows_layout_deinit();
212 mainwindow_activity_deinit();
213 mainwindows_deinit();
214 gui_expandos_deinit();
215 textbuffer_commands_deinit();
216 textbuffer_view_deinit();
226 fe_common_core_deinit();
231 static void check_files(void)
235 if (stat(get_irssi_dir(), &statbuf) != 0) {
236 /* ~/.irssi doesn't exist, first time running irssi */
237 display_firsttimer = TRUE;
242 static void winsock_init(void)
244 WORD wVersionRequested;
247 wVersionRequested = MAKEWORD(2, 2);
249 if (WSAStartup(wVersionRequested, &wsaData) != 0) {
250 printf("Error initializing winsock\n");
263 GMemVTable gc_mem_table = {
272 int main(int argc, char **argv)
274 static int version = 0;
275 static GOptionEntry options[] = {
276 { "version", 'v', 0, G_OPTION_ARG_NONE, &version, "Display version", NULL },
281 g_mem_set_vtable(&gc_mem_table);
284 core_register_options();
285 fe_common_core_register_options();
291 core_preinit(argv[0]);
302 /* setlocale() must be called at the beginning before any calls that
303 affect it, especially regexps seem to break if they're generated
306 locales aren't actually used for anything else than autodetection
309 furthermore to get the users's charset with g_get_charset() properly
310 you have to call setlocale(LC_ALL, "") */
311 setlocale(LC_ALL, "");
315 args_register(options);
316 args_execute(argc, argv);
319 printf(PACKAGE" " IRSSI_VERSION" (%d %04d)\n",
320 IRSSI_VERSION_DATE, IRSSI_VERSION_TIME);
324 if (!dummy && !term_init()) {
325 fprintf(stderr, "Can't initialize screen handling, quitting.\n");
326 fprintf(stderr, "You can still use the dummy mode with -d parameter\n");
330 textui_finish_init();
331 main_loop = g_main_new(TRUE);
333 /* Does the same as g_main_run(main_loop), except we
334 can call our dirty-checker after each iteration */
337 GC_collect_a_little();
339 if (!dummy) term_refresh_freeze();
340 g_main_iteration(TRUE);
341 if (!dummy) term_refresh_thaw();
344 /* SIGHUP received, do /RELOAD */
345 reload_config = FALSE;
346 signal_emit("command reload", 1, "");
352 g_main_destroy(main_loop);
355 session_upgrade(); /* if we /UPGRADEd, start the new process */