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;
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();
159 textbuffer_reformat_init();
161 gui_printtext_init();
165 mainwindow_activity_init();
166 mainwindows_layout_init();
171 /* don't check settings with dummy mode */
175 module_register("core", "fe-text");
177 #ifdef HAVE_STATIC_PERL
184 fe_common_core_finish_init();
185 signal_emit("irssi init finished", 0);
188 static void textui_deinit(void)
190 signal(SIGINT, SIG_DFL);
192 term_refresh_freeze();
193 while (modules != NULL)
194 module_unload(modules->data);
196 #ifdef HAVE_STATIC_PERL
201 dirty_check(); /* one last time to print any quit messages */
202 signal_remove("gui exit", (SIGNAL_FUNC) sig_exit);
209 gui_printtext_deinit();
210 gui_readline_deinit();
211 gui_windows_deinit();
212 mainwindows_layout_deinit();
213 mainwindow_activity_deinit();
214 mainwindows_deinit();
215 gui_expandos_deinit();
216 textbuffer_reformat_deinit();
217 textbuffer_commands_deinit();
218 textbuffer_view_deinit();
228 fe_common_core_deinit();
233 static void check_oldcrap(void)
236 char *path, str[256];
239 /* check that default.theme is up-to-date */
240 path = g_strdup_printf("%s/default.theme", get_irssi_dir());
241 f = fopen(path, "r+");
247 while (!found && fgets(str, sizeof(str), f) != NULL)
248 found = strstr(str, "abstracts = ") != NULL;
256 printf("\nYou seem to have old default.theme in "IRSSI_DIR_SHORT"/ directory.\n");
257 printf("Themeing system has changed a bit since last irssi release,\n");
258 printf("you should either delete your old default.theme or manually\n");
259 printf("merge it with the new default.theme.\n\n");
260 printf("Do you want to delete the old theme now? (Y/n)\n");
263 fgets(str, sizeof(str), stdin);
264 if (i_toupper(str[0]) == 'Y' || str[0] == '\n' || str[0] == '\0')
269 static void check_files(void)
273 if (stat(get_irssi_dir(), &statbuf) != 0) {
274 /* ~/.irssi doesn't exist, first time running irssi */
275 display_firsttimer = TRUE;
282 static void winsock_init(void)
284 WORD wVersionRequested;
287 wVersionRequested = MAKEWORD(2, 2);
289 if (WSAStartup(wVersionRequested, &wsaData) != 0) {
290 printf("Error initializing winsock\n");
303 GMemVTable gc_mem_table = {
312 int main(int argc, char **argv)
314 static struct poptOption options[] = {
315 #if 0 /* --dummy is not available in SILC Client */
316 { "dummy", 'd', POPT_ARG_NONE, &dummy, 0, "Use the dummy terminal mode", NULL },
318 { NULL, '\0', 0, NULL }
322 g_mem_set_vtable(&gc_mem_table);
329 core_init_paths(argc, argv);
340 /* initialize the i18n stuff */
341 bindtextdomain(PACKAGE, LOCALEDIR);
345 /* setlocale() must be called at the beginning before any calls that
346 affect it, especially regexps seem to break if they're generated
349 locales aren't actually used for anything else than autodetection
352 furthermore to get the users's charset with g_get_charset() properly
353 you have to call setlocale(LC_ALL, "") */
354 setlocale(LC_ALL, "");
357 args_register(options);
358 args_execute(argc, argv);
360 if (!dummy && !term_init()) {
361 fprintf(stderr, "Can't initialize screen handling, quitting.\n");
362 fprintf(stderr, "You can still use the dummy mode with -d parameter\n");
366 textui_finish_init();
367 main_loop = g_main_new(TRUE);
369 /* Does the same as g_main_run(main_loop), except we
370 can call our dirty-checker after each iteration */
373 GC_collect_a_little();
375 if (!dummy) term_refresh_freeze();
376 g_main_iteration(TRUE);
377 if (!dummy) term_refresh_thaw();
380 /* SIGHUP received, do /RELOAD */
381 reload_config = FALSE;
382 signal_emit("command reload", 1, "");
388 g_main_destroy(main_loop);
391 session_upgrade(); /* if we /UPGRADEd, start the new process */