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 "textbuffer-reformat.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;
84 static int display_firsttimer = FALSE;
86 /* Protocol exit signal to tell protocol has gone away. Safe to quit. */
88 static void sig_protocol_exit(void)
90 protocols_deinit = TRUE;
91 if (!quitting && quit_signalled)
95 static void sig_exit(void)
97 quit_signalled = TRUE;
99 /* If protocol hasn't finished yet, wait untill it sends "chat protocol
101 if (!protocols_deinit)
106 /* redraw irssi's screen.. */
107 void irssi_redraw(void)
113 void irssi_set_dirty(void)
118 static void dirty_check(void)
128 /* first clear the screen so curses will be
129 forced to redraw the screen */
133 mainwindows_redraw();
134 statusbar_redraw(NULL, TRUE);
137 mainwindows_redraw_dirty();
138 statusbar_redraw_dirty();
144 static void textui_init(void)
147 struct sigaction act;
149 sigemptyset(&act.sa_mask);
151 act.sa_handler = SIG_IGN;
152 sigaction(SIGTRAP, &act, NULL);
155 irssi_gui = IRSSI_GUI_TEXT;
158 fe_common_core_init();
161 theme_register(gui_text_formats);
162 signal_add_last("gui exit", (SIGNAL_FUNC) sig_exit);
163 signal_add_last("chat protocol deinit",
164 (SIGNAL_FUNC) sig_protocol_exit);
167 static void textui_finish_init(void)
170 quit_signalled = FALSE;
171 protocols_deinit = FALSE;
176 term_refresh_freeze();
178 textbuffer_view_init();
179 textbuffer_commands_init();
180 textbuffer_reformat_init();
182 gui_printtext_init();
186 mainwindow_activity_init();
187 mainwindows_layout_init();
192 /* don't check settings with dummy mode */
196 module_register("core", "fe-text");
198 #ifdef HAVE_STATIC_PERL
205 fe_common_core_finish_init();
206 signal_emit("irssi init finished", 0);
209 static void textui_deinit(void)
211 signal(SIGINT, SIG_DFL);
213 term_refresh_freeze();
214 while (modules != NULL)
215 module_unload(modules->data);
217 #ifdef HAVE_STATIC_PERL
222 dirty_check(); /* one last time to print any quit messages */
223 signal_remove("gui exit", (SIGNAL_FUNC) sig_exit);
224 signal_remove("chat protocol deinit", (SIGNAL_FUNC) sig_protocol_exit);
231 gui_printtext_deinit();
232 gui_readline_deinit();
233 gui_windows_deinit();
234 mainwindows_layout_deinit();
235 mainwindow_activity_deinit();
236 mainwindows_deinit();
237 gui_expandos_deinit();
238 textbuffer_reformat_deinit();
239 textbuffer_commands_deinit();
240 textbuffer_view_deinit();
250 fe_common_core_deinit();
255 static void check_oldcrap(void)
258 char *path, str[256];
261 /* check that default.theme is up-to-date */
262 path = g_strdup_printf("%s/default.theme", get_irssi_dir());
263 f = fopen(path, "r+");
269 while (!found && fgets(str, sizeof(str), f) != NULL)
270 found = strstr(str, "abstracts = ") != NULL;
278 printf("\nYou seem to have old default.theme in "IRSSI_DIR_SHORT"/ directory.\n");
279 printf("Themeing system has changed a bit since last irssi release,\n");
280 printf("you should either delete your old default.theme or manually\n");
281 printf("merge it with the new default.theme.\n\n");
282 printf("Do you want to delete the old theme now? (Y/n)\n");
285 fgets(str, sizeof(str), stdin);
286 if (i_toupper(str[0]) == 'Y' || str[0] == '\n' || str[0] == '\0')
291 static void check_files(void)
295 if (stat(get_irssi_dir(), &statbuf) != 0) {
296 /* ~/.irssi doesn't exist, first time running irssi */
297 display_firsttimer = TRUE;
304 static void winsock_init(void)
306 WORD wVersionRequested;
309 wVersionRequested = MAKEWORD(2, 2);
311 if (WSAStartup(wVersionRequested, &wsaData) != 0) {
312 printf("Error initializing winsock\n");
325 GMemVTable gc_mem_table = {
334 int main(int argc, char **argv)
336 static struct poptOption options[] = {
337 #if 0 /* --dummy is not available in SILC Client */
338 { "dummy", 'd', POPT_ARG_NONE, &dummy, 0, "Use the dummy terminal mode", NULL },
340 { NULL, '\0', 0, NULL }
344 g_mem_set_vtable(&gc_mem_table);
351 quit_signalled = FALSE;
352 protocols_deinit = FALSE;
353 core_init_paths(argc, argv);
364 /* initialize the i18n stuff */
365 bindtextdomain(PACKAGE, LOCALEDIR);
369 /* setlocale() must be called at the beginning before any calls that
370 affect it, especially regexps seem to break if they're generated
373 locales aren't actually used for anything else than autodetection
376 furthermore to get the users's charset with g_get_charset() properly
377 you have to call setlocale(LC_ALL, "") */
378 setlocale(LC_ALL, "");
381 args_register(options);
382 args_execute(argc, argv);
384 if (!dummy && !term_init()) {
385 fprintf(stderr, "Can't initialize screen handling, quitting.\n");
386 fprintf(stderr, "You can still use the dummy mode with -d parameter\n");
390 textui_finish_init();
391 main_loop = g_main_new(TRUE);
393 /* Does the same as g_main_run(main_loop), except we
394 can call our dirty-checker after each iteration */
397 GC_collect_a_little();
399 if (!dummy) term_refresh_freeze();
400 g_main_iteration(TRUE);
401 if (!dummy) term_refresh_thaw();
404 /* SIGHUP received, do /RELOAD */
405 reload_config = FALSE;
406 signal_emit("command reload", 1, "");
412 g_main_destroy(main_loop);
415 session_upgrade(); /* if we /UPGRADEd, start the new process */