updates
[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         quitting = TRUE;
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 0
152         if (display_firsttimer) {
153                 printtext_window(active_win, MSGLEVEL_CLIENTNOTICE,
154                                  "%s", firsttimer_text);
155         }
156 #endif
157
158         screen_refresh_thaw();
159 }
160
161 static void textui_deinit(void)
162 {
163         signal(SIGINT, SIG_DFL);
164
165         screen_refresh_freeze();
166         while (modules != NULL)
167                 module_unload(modules->data);
168
169         signal_remove("gui exit", (SIGNAL_FUNC) sig_exit);
170
171         lastlog_deinit();
172         statusbar_deinit();
173         gui_printtext_deinit();
174         gui_readline_deinit();
175         gui_windows_deinit();
176         mainwindows_save_deinit();
177         mainwindow_activity_deinit();
178         mainwindows_deinit();
179         gui_expandos_deinit();
180         gui_entry_deinit();
181         textbuffer_commands_deinit();
182         textbuffer_view_deinit();
183         textbuffer_deinit();
184
185         screen_refresh_thaw();
186         deinit_screen();
187
188 #ifdef HAVE_STATIC_PERL
189         fe_perl_deinit();
190         perl_core_deinit();
191 #endif
192
193         theme_unregister();
194
195         fe_common_silc_deinit();
196         fe_common_core_deinit();
197         silc_deinit();
198         core_deinit();
199 }
200
201 static void check_oldcrap(void)
202 {
203         FILE *f;
204         char *path, str[256];
205         int found;
206
207         /* check that default.theme is up-to-date */
208         path = g_strdup_printf("%s/.silc/default.theme", g_get_home_dir());
209         f = fopen(path, "r+");
210         if (f == NULL) {
211                 g_free(path);
212                 return;
213         }
214         found = FALSE;
215         while (!found && fgets(str, sizeof(str), f) != NULL)
216                 found = strstr(str, "abstracts = ") != NULL;
217         fclose(f);
218
219         if (found) {
220                 g_free(path);
221                 return;
222         }
223
224         printf("\nYou seem to have old default.theme in ~/.silc/ directory.\n");
225         printf("Themeing system has changed a bit since last irssi release,\n");
226         printf("you should either delete your old default.theme or manually\n");
227         printf("merge it with the new default.theme.\n\n");
228         printf("Do you want to delete the old theme now? (Y/n)\n");
229
230         str[0] = '\0';
231         fgets(str, sizeof(str), stdin);
232         if (toupper(str[0]) == 'Y' || str[0] == '\n' || str[0] == '\0')
233                 remove(path);
234         g_free(path);
235 }
236
237 static void check_files(void)
238 {
239         struct stat statbuf;
240         char *path;
241
242         path = g_strdup_printf("%s/.silc", g_get_home_dir());
243         if (stat(path, &statbuf) != 0) {
244                 /* ~/.irssi doesn't exist, first time running irssi */
245                 display_firsttimer = TRUE;
246         } else {
247                 check_oldcrap();
248         }
249         g_free(path);
250 }
251
252 #ifdef WIN32
253 static void winsock_init(void)
254 {
255         WORD wVersionRequested;
256         WSADATA wsaData;
257
258         wVersionRequested = MAKEWORD(2, 2);
259
260         if (WSAStartup(wVersionRequested, &wsaData) != 0) {
261                 printf("Error initializing winsock\n");
262                 exit(1);
263         }
264 }
265 #endif
266
267 int main(int argc, char **argv)
268 {
269         check_files();
270 #ifdef WIN32
271         winsock_init();
272 #endif
273 #ifdef HAVE_SOCKS
274         SOCKSinit(argv[0]);
275 #endif
276 #ifdef ENABLE_NLS
277         /* initialize the i18n stuff */
278         bindtextdomain(PACKAGE, LOCALEDIR);
279         textdomain(PACKAGE);
280 #endif
281
282         quitting = FALSE;
283
284         textui_init();
285         args_execute(argc, argv);
286         silc_init_finish();
287
288         if (!init_screen())
289                 g_error("Can't initialize screen handling, quitting.\n");
290
291         textui_finish_init();
292         main_loop = g_main_new(TRUE);
293
294         while (!quitting) {
295                 g_main_iteration(TRUE);
296                 screen_check_resizes();
297         }
298
299         g_main_destroy(main_loop);
300         textui_deinit();
301
302 #ifdef MEM_DEBUG
303         ig_mem_profile();
304 #endif
305
306         return 0;
307 }