Merged from silc_1_0_branch (second merge).
[silc.git] / apps / irssi / src / fe-common / core / fe-common-core.c
index 8cfb3a85d0eede745bde7653935fa5f7ac2ccd7b..bc556a6a5db81fc1b2fc208e0757e69c84a4a810 100644 (file)
 #include "misc.h"
 #include "levels.h"
 #include "settings.h"
+#include "irssi-version.h"
 
+#include "servers.h"
 #include "channels.h"
 #include "servers-setup.h"
 
+#include "autorun.h"
+#include "fe-core-commands.h"
 #include "fe-queries.h"
 #include "hilight-text.h"
 #include "command-history.h"
@@ -39,6 +43,7 @@
 #include "translation.h"
 #include "fe-channels.h"
 #include "fe-windows.h"
+#include "window-activity.h"
 #include "window-items.h"
 #include "windows-layout.h"
 
@@ -51,9 +56,6 @@ static int no_autoconnect;
 static char *cmdline_nick;
 static char *cmdline_hostname;
 
-void autorun_init(void);
-void autorun_deinit(void);
-
 void fe_core_log_init(void);
 void fe_core_log_deinit(void);
 
@@ -87,14 +89,15 @@ void fe_server_deinit(void);
 void fe_settings_init(void);
 void fe_settings_deinit(void);
 
-void window_activity_init(void);
-void window_activity_deinit(void);
-
 void window_commands_init(void);
 void window_commands_deinit(void);
 
-void fe_core_commands_init(void);
-void fe_core_commands_deinit(void);
+static void print_version(void)
+{
+       printf(PACKAGE" " IRSSI_VERSION" (%d %04d)\n",
+              IRSSI_VERSION_DATE, IRSSI_VERSION_TIME);
+        exit(0);
+}
 
 static void sig_connected(SERVER_REC *server)
 {
@@ -104,6 +107,7 @@ static void sig_connected(SERVER_REC *server)
 static void sig_disconnected(SERVER_REC *server)
 {
        g_free(MODULE_DATA(server));
+       MODULE_DATA_UNSET(server);
 }
 
 static void sig_channel_created(CHANNEL_REC *channel)
@@ -114,13 +118,22 @@ static void sig_channel_created(CHANNEL_REC *channel)
 static void sig_channel_destroyed(CHANNEL_REC *channel)
 {
        g_free(MODULE_DATA(channel));
+       MODULE_DATA_UNSET(channel);
 }
 
 void fe_common_core_init(void)
 {
+       static struct poptOption version_options[] = {
+               { NULL, '\0', POPT_ARG_CALLBACK, (void *)&print_version, '\0', NULL },
+               { "version", 'v', POPT_ARG_NONE, NULL, 0, "Display irssi version" },
+               { NULL, '\0', 0, NULL }
+       };
+
        static struct poptOption options[] = {
-               { "connect", 'c', POPT_ARG_STRING, &autocon_server, 0, "Automatically connect to server/ircnet", "SERVER" },
-               { "password", 'w', POPT_ARG_STRING, &autocon_password, 0, "Autoconnect password", "SERVER" },
+               { NULL, '\0', POPT_ARG_INCLUDE_TABLE, version_options, 0, NULL, NULL },
+               POPT_AUTOHELP
+               { "connect", 'c', POPT_ARG_STRING, &autocon_server, 0, "Automatically connect to server", "SERVER" },
+               { "password", 'w', POPT_ARG_STRING, &autocon_password, 0, "Autoconnect password", "PASSWORD" },
                { "port", 'p', POPT_ARG_INT, &autocon_port, 0, "Autoconnect port", "PORT" },
                { "noconnect", '!', POPT_ARG_NONE, &no_autoconnect, 0, "Disable autoconnecting", NULL },
                { "nick", 'n', POPT_ARG_STRING, &cmdline_nick, 0, "Specify nick to use", NULL },
@@ -130,14 +143,14 @@ void fe_common_core_init(void)
 
        autocon_server = NULL;
        autocon_password = NULL;
-       autocon_port = 6667;
+       autocon_port = 0;
        no_autoconnect = FALSE;
        cmdline_nick = NULL;
        cmdline_hostname = NULL;
        args_register(options);
 
        settings_add_bool("lookandfeel", "timestamps", TRUE);
-       settings_add_bool("lookandfeel", "msgs_timestamps", FALSE);
+       settings_add_str("lookandfeel", "timestamp_level", "ALL");
        settings_add_int("lookandfeel", "timestamp_timeout", 0);
 
        settings_add_bool("lookandfeel", "bell_beeps", FALSE);
@@ -146,6 +159,7 @@ void fe_common_core_init(void)
        settings_add_bool("lookandfeel", "beep_when_away", TRUE);
 
        settings_add_bool("lookandfeel", "hide_text_style", FALSE);
+       settings_add_bool("lookandfeel", "hide_colors", FALSE);
        settings_add_bool("lookandfeel", "hide_server_tags", FALSE);
 
        settings_add_bool("lookandfeel", "use_status_window", TRUE);
@@ -154,7 +168,6 @@ void fe_common_core_init(void)
        themes_init();
         theme_register(fecommon_core_formats);
 
-       autorun_init();
        command_history_init();
        completion_init();
        keyboard_init();
@@ -191,11 +204,12 @@ void fe_common_core_init(void)
         signal_add_last("server disconnected", (SIGNAL_FUNC) sig_disconnected);
         signal_add_first("channel created", (SIGNAL_FUNC) sig_channel_created);
         signal_add_last("channel destroyed", (SIGNAL_FUNC) sig_channel_destroyed);
+
+       module_register("core", "fe");
 }
 
 void fe_common_core_deinit(void)
 {
-       autorun_deinit();
        hilight_text_deinit();
        command_history_deinit();
        completion_deinit();
@@ -224,7 +238,7 @@ void fe_common_core_deinit(void)
         fe_queries_deinit();
 
        fe_messages_deinit();
-       fe_ignore_messages_init();
+       fe_ignore_messages_deinit();
 
         theme_unregister();
        themes_deinit();
@@ -253,13 +267,15 @@ void glog_func(const char *log_domain, GLogLevelFlags log_level,
        }
 
        if (windows == NULL)
-               fprintf(stderr, "GLib %s: %s", reason, message);
+               fprintf(stderr, "GLib %s: %s\n", reason, message);
        else {
                printformat(NULL, NULL, MSGLEVEL_CLIENTERROR,
                            TXT_GLIB_ERROR, reason, message);
        }
 }
 
+#define MSGS_WINDOW_LEVELS (MSGLEVEL_MSGS|MSGLEVEL_ACTIONS|MSGLEVEL_DCCMSGS)
+
 static void create_windows(void)
 {
        WINDOW_REC *window;
@@ -273,13 +289,15 @@ static void create_windows(void)
                window_set_name(window, "(status)");
                window_set_level(window, MSGLEVEL_ALL ^
                                 (settings_get_bool("use_msgs_window") ?
-                                 (MSGLEVEL_MSGS|MSGLEVEL_DCCMSGS) : 0));
+                                 MSGS_WINDOW_LEVELS : 0));
+                window_set_immortal(window, TRUE);
        }
 
        if (settings_get_bool("use_msgs_window")) {
                window = window_create(NULL, TRUE);
                window_set_name(window, "(msgs)");
-               window_set_level(window, MSGLEVEL_MSGS|MSGLEVEL_DCCMSGS);
+               window_set_level(window, MSGS_WINDOW_LEVELS);
+                window_set_immortal(window, TRUE);
        }
 
        if (windows == NULL) {
@@ -329,20 +347,25 @@ static void autoconnect_servers(void)
 
 void fe_common_core_finish_init(void)
 {
+       int setup_changed;
+
        signal_emit("irssi init read settings", 0);
 
 #ifdef SIGPIPE
        signal(SIGPIPE, SIG_IGN);
 #endif
 
+        setup_changed = FALSE;
        if (cmdline_nick != NULL) {
                /* override nick found from setup */
                settings_set_str("nick", cmdline_nick);
+               setup_changed = TRUE;
        }
 
        if (cmdline_hostname != NULL) {
                /* override host name found from setup */
                settings_set_str("hostname", cmdline_hostname);
+               setup_changed = TRUE;
        }
 
        create_windows();
@@ -353,5 +376,9 @@ void fe_common_core_finish_init(void)
                                            G_LOG_LEVEL_WARNING),
                          (GLogFunc) glog_func, NULL);
 
+       if (setup_changed)
+                signal_emit("setup changed", 0);
+
+        autorun_startup();
        autoconnect_servers();
 }