updates.
[silc.git] / apps / irssi / src / fe-common / core / fe-common-core.c
1 /*
2  fe-common-core.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 "misc.h"
25 #include "levels.h"
26 #include "settings.h"
27 #include "irssi-version.h"
28
29 #include "servers.h"
30 #include "channels.h"
31 #include "servers-setup.h"
32
33 #include "autorun.h"
34 #include "fe-queries.h"
35 #include "hilight-text.h"
36 #include "command-history.h"
37 #include "completion.h"
38 #include "keyboard.h"
39 #include "printtext.h"
40 #include "formats.h"
41 #include "themes.h"
42 #include "translation.h"
43 #include "fe-channels.h"
44 #include "fe-windows.h"
45 #include "window-activity.h"
46 #include "window-items.h"
47 #include "windows-layout.h"
48
49 #include <signal.h>
50
51 static char *autocon_server;
52 static char *autocon_password;
53 static int autocon_port;
54 static int no_autoconnect;
55 static char *cmdline_nick;
56 static char *cmdline_hostname;
57
58 void fe_core_log_init(void);
59 void fe_core_log_deinit(void);
60
61 void fe_exec_init(void);
62 void fe_exec_deinit(void);
63
64 void fe_expandos_init(void);
65 void fe_expandos_deinit(void);
66
67 void fe_help_init(void);
68 void fe_help_deinit(void);
69
70 void fe_ignore_init(void);
71 void fe_ignore_deinit(void);
72
73 void fe_ignore_messages_init(void);
74 void fe_ignore_messages_deinit(void);
75
76 void fe_log_init(void);
77 void fe_log_deinit(void);
78
79 void fe_messages_init(void);
80 void fe_messages_deinit(void);
81
82 void fe_modules_init(void);
83 void fe_modules_deinit(void);
84
85 void fe_server_init(void);
86 void fe_server_deinit(void);
87
88 void fe_settings_init(void);
89 void fe_settings_deinit(void);
90
91 void window_commands_init(void);
92 void window_commands_deinit(void);
93
94 void fe_core_commands_init(void);
95 void fe_core_commands_deinit(void);
96
97 static void print_version(void)
98 {
99         printf(PACKAGE" " IRSSI_VERSION" (%d %04d)\n",
100                IRSSI_VERSION_DATE, IRSSI_VERSION_TIME);
101         exit(0);
102 }
103
104 static void sig_connected(SERVER_REC *server)
105 {
106         MODULE_DATA_SET(server, g_new0(MODULE_SERVER_REC, 1));
107 }
108
109 static void sig_disconnected(SERVER_REC *server)
110 {
111         g_free(MODULE_DATA(server));
112         MODULE_DATA_UNSET(server);
113 }
114
115 static void sig_channel_created(CHANNEL_REC *channel)
116 {
117         MODULE_DATA_SET(channel, g_new0(MODULE_CHANNEL_REC, 1));
118 }
119
120 static void sig_channel_destroyed(CHANNEL_REC *channel)
121 {
122         g_free(MODULE_DATA(channel));
123         MODULE_DATA_UNSET(channel);
124 }
125
126 void fe_common_core_init(void)
127 {
128         static struct poptOption version_options[] = {
129                 { NULL, '\0', POPT_ARG_CALLBACK, (void *)&print_version, '\0', NULL },
130                 { "version", 'v', POPT_ARG_NONE, NULL, 0, "Display irssi version" },
131                 { NULL, '\0', 0, NULL }
132         };
133
134         static struct poptOption options[] = {
135                 { NULL, '\0', POPT_ARG_INCLUDE_TABLE, version_options, 0, NULL, NULL },
136                 POPT_AUTOHELP
137                 { "connect", 'c', POPT_ARG_STRING, &autocon_server, 0, "Automatically connect to server/ircnet", "SERVER" },
138                 { "password", 'w', POPT_ARG_STRING, &autocon_password, 0, "Autoconnect password", "PASSWORD" },
139                 { "port", 'p', POPT_ARG_INT, &autocon_port, 0, "Autoconnect port", "PORT" },
140                 { "noconnect", '!', POPT_ARG_NONE, &no_autoconnect, 0, "Disable autoconnecting", NULL },
141                 { "nick", 'n', POPT_ARG_STRING, &cmdline_nick, 0, "Specify nick to use", NULL },
142                 { "hostname", 'h', POPT_ARG_STRING, &cmdline_hostname, 0, "Specify host name to use", NULL },
143                 { NULL, '\0', 0, NULL }
144         };
145
146         autocon_server = NULL;
147         autocon_password = NULL;
148         autocon_port = 6667;
149         no_autoconnect = FALSE;
150         cmdline_nick = NULL;
151         cmdline_hostname = NULL;
152         args_register(options);
153
154         settings_add_bool("lookandfeel", "timestamps", TRUE);
155         settings_add_str("lookandfeel", "timestamp_level", "ALL");
156         settings_add_int("lookandfeel", "timestamp_timeout", 0);
157
158         settings_add_bool("lookandfeel", "bell_beeps", FALSE);
159         settings_add_str("lookandfeel", "beep_msg_level", "");
160         settings_add_bool("lookandfeel", "beep_when_window_active", TRUE);
161         settings_add_bool("lookandfeel", "beep_when_away", TRUE);
162
163         settings_add_bool("lookandfeel", "hide_text_style", FALSE);
164         settings_add_bool("lookandfeel", "hide_colors", FALSE);
165         settings_add_bool("lookandfeel", "hide_server_tags", FALSE);
166
167         settings_add_bool("lookandfeel", "use_status_window", TRUE);
168         settings_add_bool("lookandfeel", "use_msgs_window", FALSE);
169
170         themes_init();
171         theme_register(fecommon_core_formats);
172
173         command_history_init();
174         completion_init();
175         keyboard_init();
176         printtext_init();
177         formats_init();
178 #ifndef WIN32
179         fe_exec_init();
180 #endif
181         fe_expandos_init();
182         fe_help_init();
183         fe_ignore_init();
184         fe_log_init();
185         fe_modules_init();
186         fe_server_init();
187         fe_settings_init();
188         translation_init();
189         windows_init();
190         window_activity_init();
191         window_commands_init();
192         window_items_init();
193         windows_layout_init();
194         fe_core_commands_init();
195
196         fe_channels_init();
197         fe_queries_init();
198
199         fe_messages_init();
200         hilight_text_init();
201         fe_ignore_messages_init();
202
203         settings_check();
204
205         signal_add_first("server connected", (SIGNAL_FUNC) sig_connected);
206         signal_add_last("server disconnected", (SIGNAL_FUNC) sig_disconnected);
207         signal_add_first("channel created", (SIGNAL_FUNC) sig_channel_created);
208         signal_add_last("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed);
209
210         module_register("core", "fe");
211 }
212
213 void fe_common_core_deinit(void)
214 {
215         hilight_text_deinit();
216         command_history_deinit();
217         completion_deinit();
218         keyboard_deinit();
219         printtext_deinit();
220         formats_deinit();
221 #ifndef WIN32
222         fe_exec_deinit();
223 #endif
224         fe_expandos_deinit();
225         fe_help_deinit();
226         fe_ignore_deinit();
227         fe_log_deinit();
228         fe_modules_deinit();
229         fe_server_deinit();
230         fe_settings_deinit();
231         translation_deinit();
232         windows_deinit();
233         window_activity_deinit();
234         window_commands_deinit();
235         window_items_deinit();
236         windows_layout_deinit();
237         fe_core_commands_deinit();
238
239         fe_channels_deinit();
240         fe_queries_deinit();
241
242         fe_messages_deinit();
243         fe_ignore_messages_deinit();
244
245         theme_unregister();
246         themes_deinit();
247
248         signal_remove("server connected", (SIGNAL_FUNC) sig_connected);
249         signal_remove("server disconnected", (SIGNAL_FUNC) sig_disconnected);
250         signal_remove("channel created", (SIGNAL_FUNC) sig_channel_created);
251         signal_remove("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed);
252 }
253
254 void glog_func(const char *log_domain, GLogLevelFlags log_level,
255                const char *message)
256 {
257         const char *reason;
258
259         switch (log_level) {
260         case G_LOG_LEVEL_WARNING:
261                 reason = "warning";
262                 break;
263         case G_LOG_LEVEL_CRITICAL:
264                 reason = "critical";
265                 break;
266         default:
267                 reason = "error";
268                 break;
269         }
270
271         if (windows == NULL)
272                 fprintf(stderr, "GLib %s: %s\n", reason, message);
273         else {
274                 printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
275                             TXT_GLIB_ERROR, reason, message);
276         }
277 }
278
279 static void create_windows(void)
280 {
281         WINDOW_REC *window;
282
283         windows_layout_restore();
284         if (windows != NULL)
285                 return;
286
287         if (settings_get_bool("use_status_window")) {
288                 window = window_create(NULL, TRUE);
289                 window_set_name(window, "(status)");
290                 window_set_level(window, MSGLEVEL_ALL ^
291                                  (settings_get_bool("use_msgs_window") ?
292                                   (MSGLEVEL_MSGS|MSGLEVEL_DCCMSGS) : 0));
293                 window_set_immortal(window, TRUE);
294         }
295
296         if (settings_get_bool("use_msgs_window")) {
297                 window = window_create(NULL, TRUE);
298                 window_set_name(window, "(msgs)");
299                 window_set_level(window, MSGLEVEL_MSGS|MSGLEVEL_DCCMSGS);
300                 window_set_immortal(window, TRUE);
301         }
302
303         if (windows == NULL) {
304                 /* we have to have at least one window.. */
305                 window = window_create(NULL, TRUE);
306         }
307 }
308
309 static void autoconnect_servers(void)
310 {
311         GSList *tmp, *chatnets;
312         char *str;
313
314         if (autocon_server != NULL) {
315                 /* connect to specified server */
316                 str = g_strdup_printf(autocon_password == NULL ? "%s %d" : "%s %d %s",
317                                       autocon_server, autocon_port, autocon_password);
318                 signal_emit("command connect", 1, str);
319                 g_free(str);
320                 return;
321         }
322
323         if (no_autoconnect) {
324                 /* don't autoconnect */
325                 return;
326         }
327
328         /* connect to autoconnect servers */
329         chatnets = NULL;
330         for (tmp = setupservers; tmp != NULL; tmp = tmp->next) {
331                 SERVER_SETUP_REC *rec = tmp->data;
332
333                 if (rec->autoconnect &&
334                     (rec->chatnet == NULL ||
335                      gslist_find_icase_string(chatnets, rec->chatnet) == NULL)) {
336                         if (rec->chatnet != NULL)
337                                 chatnets = g_slist_append(chatnets, rec->chatnet);
338
339                         str = g_strdup_printf("%s %d", rec->address, rec->port);
340                         signal_emit("command connect", 1, str);
341                         g_free(str);
342                 }
343         }
344
345         g_slist_free(chatnets);
346 }
347
348 void fe_common_core_finish_init(void)
349 {
350         int setup_changed;
351
352         signal_emit("irssi init read settings", 0);
353
354 #ifdef SIGPIPE
355         signal(SIGPIPE, SIG_IGN);
356 #endif
357
358         setup_changed = FALSE;
359         if (cmdline_nick != NULL) {
360                 /* override nick found from setup */
361                 settings_set_str("nick", cmdline_nick);
362                 setup_changed = TRUE;
363         }
364
365         if (cmdline_hostname != NULL) {
366                 /* override host name found from setup */
367                 settings_set_str("hostname", cmdline_hostname);
368                 setup_changed = TRUE;
369         }
370
371         create_windows();
372
373         /* _after_ windows are created.. */
374         g_log_set_handler(G_LOG_DOMAIN,
375                           (GLogLevelFlags) (G_LOG_LEVEL_CRITICAL |
376                                             G_LOG_LEVEL_WARNING),
377                           (GLogFunc) glog_func, NULL);
378
379         if (setup_changed)
380                 signal_emit("setup changed", 0);
381
382         autorun_startup();
383         autoconnect_servers();
384 }