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