imported irssi.
[silc.git] / apps / irssi / src / fe-text / silc.c
1 /*
2  irssi.c : irssi
3
4     Copyright (C) 1999-2000 Timo Sirainen
5
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.
10
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.
15
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
19 */
20
21 #include "module.h"
22 #include "module-formats.h"
23 #include "args.h"
24 #include "signals.h"
25 #include "levels.h"
26 #include "core.h"
27 #include "settings.h"
28
29 #include "printtext.h"
30 #include "fe-common-core.h"
31 #include "fe-common-silc.h"
32 #include "themes.h"
33
34 #include "screen.h"
35 #include "gui-entry.h"
36 #include "mainwindows.h"
37 #include "gui-printtext.h"
38 #include "gui-readline.h"
39 #include "statusbar.h"
40 #include "gui-windows.h"
41
42 #include <signal.h>
43
44 #ifdef HAVE_STATIC_PERL
45 void perl_core_init(void);
46 void perl_core_deinit(void);
47
48 void fe_perl_init(void);
49 void fe_perl_deinit(void);
50 #endif
51
52 void silc_init(void);
53 void silc_deinit(void);
54
55 void gui_expandos_init(void);
56 void gui_expandos_deinit(void);
57
58 void textbuffer_commands_init(void);
59 void textbuffer_commands_deinit(void);
60
61 void lastlog_init(void);
62 void lastlog_deinit(void);
63
64 void mainwindow_activity_init(void);
65 void mainwindow_activity_deinit(void);
66
67 void mainwindows_save_init(void);
68 void mainwindows_save_deinit(void);
69
70 static GMainLoop *main_loop;
71 int quitting;
72
73 static const char *firsttimer_text =
74         "Looks like this is the first time you run irssi.\n"
75         "This is just a reminder that you really should go read\n"
76         "startup-HOWTO if you haven't already. Irssi's default\n"
77         "settings aren't probably what you've used to, and you\n"
78         "shouldn't judge the whole client as crap based on them.\n\n"
79         "You can find startup-HOWTO and more irssi beginner info at\n"
80         "http://irssi.org/beginner/";
81 static int display_firsttimer = FALSE;
82
83
84 static void sig_exit(void)
85 {
86         g_main_quit(main_loop);
87 }
88
89 /* redraw irssi's screen.. */
90 void irssi_redraw(void)
91 {
92         clear();
93         refresh();
94
95         /* windows */
96         mainwindows_redraw();
97         /* statusbar */
98         statusbar_redraw(NULL);
99         /* entry line */
100         gui_entry_redraw();
101 }
102
103 static void textui_init(void)
104 {
105         static struct poptOption options[] = {
106                 POPT_AUTOHELP
107                 { NULL, '\0', 0, NULL }
108         };
109
110         args_register(options);
111
112         irssi_gui = IRSSI_GUI_TEXT;
113         core_init();
114         silc_init();
115         fe_common_core_init();
116         fe_common_silc_init();
117
118         theme_register(gui_text_formats);
119         signal_add("gui exit", (SIGNAL_FUNC) sig_exit);
120 }
121
122 static void textui_finish_init(void)
123 {
124         quitting = FALSE;
125
126         screen_refresh_freeze();
127         textbuffer_init();
128         textbuffer_view_init();
129         textbuffer_commands_init();
130         gui_entry_init();
131         gui_expandos_init();
132         gui_printtext_init();
133         gui_readline_init();
134         lastlog_init();
135         mainwindows_init();
136         mainwindow_activity_init();
137         mainwindows_save_init();
138         gui_windows_init();
139         statusbar_init();
140
141         settings_check();
142
143         fe_common_core_finish_init();
144
145 #ifdef HAVE_STATIC_PERL
146         perl_core_init();
147         fe_perl_init();
148 #endif
149         signal_emit("irssi init finished", 0);
150
151         if (display_firsttimer) {
152                 printtext_window(active_win, MSGLEVEL_CLIENTNOTICE,
153                                  "%s", firsttimer_text);
154         }
155
156         screen_refresh_thaw();
157 }
158
159 static void textui_deinit(void)
160 {
161         quitting = TRUE;
162         signal(SIGINT, SIG_DFL);
163
164         screen_refresh_freeze();
165         while (modules != NULL)
166                 module_unload(modules->data);
167
168         signal_remove("gui exit", (SIGNAL_FUNC) sig_exit);
169
170         lastlog_deinit();
171         statusbar_deinit();
172         gui_printtext_deinit();
173         gui_readline_deinit();
174         gui_windows_deinit();
175         mainwindows_save_deinit();
176         mainwindow_activity_deinit();
177         mainwindows_deinit();
178         gui_expandos_deinit();
179         gui_entry_deinit();
180         textbuffer_commands_deinit();
181         textbuffer_view_deinit();
182         textbuffer_deinit();
183
184         screen_refresh_thaw();
185         deinit_screen();
186
187 #ifdef HAVE_STATIC_PERL
188         fe_perl_deinit();
189         perl_core_deinit();
190 #endif
191
192         theme_unregister();
193
194         fe_common_silc_deinit();
195         fe_common_core_deinit();
196         silc_deinit();
197         core_deinit();
198 }
199
200 static void check_oldcrap(void)
201 {
202         FILE *f;
203         char *path, str[256];
204         int found;
205
206         /* check that default.theme is up-to-date */
207         path = g_strdup_printf("%s/.irssi/default.theme", g_get_home_dir());
208         f = fopen(path, "r+");
209         if (f == NULL) {
210                 g_free(path);
211                 return;
212         }
213         found = FALSE;
214         while (!found && fgets(str, sizeof(str), f) != NULL)
215                 found = strstr(str, "abstracts = ") != NULL;
216         fclose(f);
217
218         if (found) {
219                 g_free(path);
220                 return;
221         }
222
223         printf("\nYou seem to have old default.theme in ~/.irssi/ directory.\n");
224         printf("Themeing system has changed a bit since last irssi release,\n");
225         printf("you should either delete your old default.theme or manually\n");
226         printf("merge it with the new default.theme.\n\n");
227         printf("Do you want to delete the old theme now? (Y/n)\n");
228
229         str[0] = '\0';
230         fgets(str, sizeof(str), stdin);
231         if (toupper(str[0]) == 'Y' || str[0] == '\n' || str[0] == '\0')
232                 remove(path);
233         g_free(path);
234 }
235
236 static void check_files(void)
237 {
238         struct stat statbuf;
239         char *path;
240
241         path = g_strdup_printf("%s/.irssi", g_get_home_dir());
242         if (stat(path, &statbuf) != 0) {
243                 /* ~/.irssi doesn't exist, first time running irssi */
244                 display_firsttimer = TRUE;
245         } else {
246                 check_oldcrap();
247         }
248         g_free(path);
249 }
250
251 #ifdef WIN32
252 static void winsock_init(void)
253 {
254         WORD wVersionRequested;
255         WSADATA wsaData;
256
257         wVersionRequested = MAKEWORD(2, 2);
258
259         if (WSAStartup(wVersionRequested, &wsaData) != 0) {
260                 printf("Error initializing winsock\n");
261                 exit(1);
262         }
263 }
264 #endif
265
266 int main(int argc, char **argv)
267 {
268         check_files();
269 #ifdef WIN32
270         winsock_init();
271 #endif
272 #ifdef HAVE_SOCKS
273         SOCKSinit(argv[0]);
274 #endif
275 #ifdef ENABLE_NLS
276         /* initialize the i18n stuff */
277         bindtextdomain(PACKAGE, LOCALEDIR);
278         textdomain(PACKAGE);
279 #endif
280
281         textui_init();
282         args_execute(argc, argv);
283
284         if (!init_screen())
285                 g_error("Can't initialize screen handling, quitting.\n");
286
287         textui_finish_init();
288         main_loop = g_main_new(TRUE);
289         g_main_run(main_loop);
290         g_main_destroy(main_loop);
291         textui_deinit();
292
293 #ifdef MEM_DEBUG
294         ig_mem_profile();
295 #endif
296
297         return 0;
298 }