Merge Irssi 0.8.16-rc1
[silc.git] / apps / irssi / src / fe-common / core / fe-common-core.c
index f356aa287588d3898c914fbbc3c3ac2131af2615..dce6890ea398e702496514ceb8c115da0c6eba90 100644 (file)
@@ -13,9 +13,9 @@
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
 
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
 #include "module.h"
 #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 "special-vars.h"
+#include "fe-core-commands.h"
 #include "fe-queries.h"
 #include "hilight-text.h"
 #include "command-history.h"
 #include "printtext.h"
 #include "formats.h"
 #include "themes.h"
-#include "translation.h"
 #include "fe-channels.h"
 #include "fe-windows.h"
 #include "window-activity.h"
 #include "window-items.h"
 #include "windows-layout.h"
+#include "fe-recode.h"
 
 #include <signal.h>
 
@@ -91,15 +91,7 @@ void fe_settings_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_setup_changed(void);
 
 static void sig_connected(SERVER_REC *server)
 {
@@ -108,7 +100,8 @@ static void sig_connected(SERVER_REC *server)
 
 static void sig_disconnected(SERVER_REC *server)
 {
-       g_free(MODULE_DATA(server));
+       void *data = MODULE_DATA(server);
+       g_free(data);
        MODULE_DATA_UNSET(server);
 }
 
@@ -119,54 +112,54 @@ static void sig_channel_created(CHANNEL_REC *channel)
 
 static void sig_channel_destroyed(CHANNEL_REC *channel)
 {
-       g_free(MODULE_DATA(channel));
+       void *data = MODULE_DATA(channel);
+
+       g_free(data);
        MODULE_DATA_UNSET(channel);
 }
 
-void fe_common_core_init(void)
+void fe_common_core_register_options(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[] = {
-               { 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/ircnet", "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 },
-               { "hostname", 'h', POPT_ARG_STRING, &cmdline_hostname, 0, "Specify host name to use", NULL },
-               { NULL, '\0', 0, NULL }
+       static GOptionEntry options[] = {
+               { "connect", 'c', 0, G_OPTION_ARG_STRING, &autocon_server, "Automatically connect to server/network", "SERVER" },
+               { "password", 'w', 0, G_OPTION_ARG_STRING, &autocon_password, "Autoconnect password", "PASSWORD" },
+               { "port", 'p', 0, G_OPTION_ARG_INT, &autocon_port, "Autoconnect port", "PORT" },
+               { "noconnect", '!', 0, G_OPTION_ARG_NONE, &no_autoconnect, "Disable autoconnecting", NULL },
+               { "nick", 'n', 0, G_OPTION_ARG_STRING, &cmdline_nick, "Specify nick to use", NULL },
+               { "hostname", 'h', 0, G_OPTION_ARG_STRING, &cmdline_hostname, "Specify host name to use", NULL },
+               { NULL }
        };
 
        autocon_server = NULL;
        autocon_password = NULL;
-       autocon_port = 6667;
+       autocon_port = 0;
        no_autoconnect = FALSE;
        cmdline_nick = NULL;
        cmdline_hostname = NULL;
        args_register(options);
+}
+
+void fe_common_core_init(void)
+{
+       const char *str;
 
        settings_add_bool("lookandfeel", "timestamps", TRUE);
-       settings_add_str("lookandfeel", "timestamp_level", "ALL");
-       settings_add_int("lookandfeel", "timestamp_timeout", 0);
+       settings_add_level("lookandfeel", "timestamp_level", "ALL");
+       settings_add_time("lookandfeel", "timestamp_timeout", "0");
 
        settings_add_bool("lookandfeel", "bell_beeps", FALSE);
-       settings_add_str("lookandfeel", "beep_msg_level", "");
+       settings_add_level("lookandfeel", "beep_msg_level", "");
        settings_add_bool("lookandfeel", "beep_when_window_active", TRUE);
        settings_add_bool("lookandfeel", "beep_when_away", TRUE);
 
        settings_add_bool("lookandfeel", "hide_text_style", FALSE);
-       settings_add_bool("lookandfeel", "hide_mirc_colors", FALSE);
+       settings_add_bool("lookandfeel", "hide_colors", FALSE);
        settings_add_bool("lookandfeel", "hide_server_tags", FALSE);
 
        settings_add_bool("lookandfeel", "use_status_window", TRUE);
        settings_add_bool("lookandfeel", "use_msgs_window", FALSE);
-
+       g_get_charset(&str);
+       settings_add_str("lookandfeel", "term_charset", str);
        themes_init();
         theme_register(fecommon_core_formats);
 
@@ -185,7 +178,6 @@ void fe_common_core_init(void)
        fe_modules_init();
        fe_server_init();
        fe_settings_init();
-       translation_init();
        windows_init();
        window_activity_init();
        window_commands_init();
@@ -199,6 +191,7 @@ void fe_common_core_init(void)
        fe_messages_init();
        hilight_text_init();
        fe_ignore_messages_init();
+       fe_recode_init();
 
        settings_check();
 
@@ -228,7 +221,6 @@ void fe_common_core_deinit(void)
        fe_modules_deinit();
        fe_server_deinit();
        fe_settings_deinit();
-       translation_deinit();
        windows_deinit();
        window_activity_deinit();
        window_commands_deinit();
@@ -241,10 +233,12 @@ void fe_common_core_deinit(void)
 
        fe_messages_deinit();
        fe_ignore_messages_deinit();
+       fe_recode_deinit();
 
         theme_unregister();
        themes_deinit();
 
+        signal_remove("setup changed", (SIGNAL_FUNC) sig_setup_changed);
         signal_remove("server connected", (SIGNAL_FUNC) sig_connected);
         signal_remove("server disconnected", (SIGNAL_FUNC) sig_disconnected);
         signal_remove("channel created", (SIGNAL_FUNC) sig_channel_created);
@@ -276,28 +270,47 @@ void glog_func(const char *log_domain, GLogLevelFlags log_level,
        }
 }
 
+#define MSGS_WINDOW_LEVELS (MSGLEVEL_MSGS|MSGLEVEL_ACTIONS|MSGLEVEL_DCCMSGS)
+
 static void create_windows(void)
 {
        WINDOW_REC *window;
-
-       windows_layout_restore();
-       if (windows != NULL)
-               return;
-
-       if (settings_get_bool("use_status_window")) {
-               window = window_create(NULL, TRUE);
-               window_set_name(window, "(status)");
-               window_set_level(window, MSGLEVEL_ALL ^
-                                (settings_get_bool("use_msgs_window") ?
-                                 (MSGLEVEL_MSGS|MSGLEVEL_DCCMSGS) : 0));
-                window_set_immortal(window, TRUE);
+       int have_status = settings_get_bool("use_status_window");
+
+       window = window_find_name("(status)");
+       if (have_status) {
+               if (window == NULL) {
+                       window = window_create(NULL, TRUE);
+                       window_set_refnum(window, 1);
+                       window_set_name(window, "(status)");
+                       window_set_level(window, MSGLEVEL_ALL ^
+                                        (settings_get_bool("use_msgs_window") ?
+                                         MSGS_WINDOW_LEVELS : 0));
+                       window_set_immortal(window, TRUE);
+               }
+       } else {
+               if (window != NULL) {
+                       window_set_name(window, NULL);
+                       window_set_level(window, 0);
+                       window_set_immortal(window, FALSE);
+               }
        }
 
+       window = window_find_name("(msgs)");
        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_immortal(window, TRUE);
+               if (window == NULL) {
+                       window = window_create(NULL, TRUE);
+                       window_set_refnum(window, have_status ? 2 : 1);
+                       window_set_name(window, "(msgs)");
+                       window_set_level(window, MSGS_WINDOW_LEVELS);
+                       window_set_immortal(window, TRUE);
+               }
+       } else {
+               if (window != NULL) {
+                       window_set_name(window, NULL);
+                       window_set_level(window, 0);
+                       window_set_immortal(window, FALSE);
+               }
        }
 
        if (windows == NULL) {
@@ -333,10 +346,13 @@ static void autoconnect_servers(void)
                if (rec->autoconnect &&
                    (rec->chatnet == NULL ||
                     gslist_find_icase_string(chatnets, rec->chatnet) == NULL)) {
-                       if (rec->chatnet != NULL)
+                       if (rec->chatnet != NULL) {
                                chatnets = g_slist_append(chatnets, rec->chatnet);
+                               str = g_strdup_printf("-network %s %s %d", rec->chatnet, rec->address, rec->port);
+                       } else {
+                               str = g_strdup_printf("%s %d", rec->address, rec->port);
+                       }
 
-                       str = g_strdup_printf("%s %d", rec->address, rec->port);
                        signal_emit("command connect", 1, str);
                        g_free(str);
                }
@@ -345,6 +361,65 @@ static void autoconnect_servers(void)
        g_slist_free(chatnets);
 }
 
+static void sig_setup_changed(void)
+{
+       static int firsttime = TRUE;
+       static int status_window = FALSE, msgs_window = FALSE;
+       int changed = FALSE;
+
+       if (settings_get_bool("use_status_window") != status_window) {
+               status_window = !status_window;
+               changed = TRUE;
+       }
+       if (settings_get_bool("use_msgs_window") != msgs_window) {
+               msgs_window = !msgs_window;
+               changed = TRUE;
+       }
+
+       if (firsttime) {
+               firsttime = FALSE;
+               changed = TRUE;
+
+               windows_layout_restore();
+               if (windows != NULL)
+                       return;
+       }
+
+       if (changed)
+               create_windows();
+}
+
+static void autorun_startup(void)
+{
+       char *path;
+       GIOChannel *handle;
+       GString *buf;
+       gsize tpos;
+
+       /* open ~/.irssi/startup and run all commands in it */
+       path = g_strdup_printf("%s/startup", get_irssi_dir());
+       handle = g_io_channel_new_file(path, "r", NULL);
+       g_free(path);
+       if (handle == NULL) {
+               /* file not found */
+               return;
+       }
+
+       g_io_channel_set_encoding(handle, NULL, NULL);
+       buf = g_string_sized_new(512);
+       while (g_io_channel_read_line_string(handle, buf, &tpos, NULL) == G_IO_STATUS_NORMAL) {
+               buf->str[tpos] = '\0';
+               if (buf->str[0] != '#') {
+                       eval_special_string(buf->str, "",
+                                           active_win->active_server,
+                                           active_win->active);
+               }
+       }
+       g_string_free(buf, TRUE);
+
+       g_io_channel_unref(handle);
+}
+
 void fe_common_core_finish_init(void)
 {
        int setup_changed;
@@ -356,7 +431,7 @@ void fe_common_core_finish_init(void)
 #endif
 
         setup_changed = FALSE;
-       if (cmdline_nick != NULL) {
+       if (cmdline_nick != NULL && *cmdline_nick != '\0') {
                /* override nick found from setup */
                settings_set_str("nick", cmdline_nick);
                setup_changed = TRUE;
@@ -368,13 +443,22 @@ void fe_common_core_finish_init(void)
                setup_changed = TRUE;
        }
 
-       create_windows();
+       sig_setup_changed();
+       signal_add_first("setup changed", (SIGNAL_FUNC) sig_setup_changed);
 
         /* _after_ windows are created.. */
+#if GLIB_CHECK_VERSION(2,6,0)
+       g_log_set_default_handler((GLogFunc) glog_func, NULL);
+#else
        g_log_set_handler(G_LOG_DOMAIN,
                          (GLogLevelFlags) (G_LOG_LEVEL_CRITICAL |
                                            G_LOG_LEVEL_WARNING),
                          (GLogFunc) glog_func, NULL);
+       g_log_set_handler("GLib",
+                         (GLogLevelFlags) (G_LOG_LEVEL_CRITICAL |
+                                           G_LOG_LEVEL_WARNING),
+                         (GLogFunc) glog_func, NULL); /* send glib errors to the same place */
+#endif
 
        if (setup_changed)
                 signal_emit("setup changed", 0);
@@ -382,3 +466,20 @@ void fe_common_core_finish_init(void)
         autorun_startup();
        autoconnect_servers();
 }
+
+gboolean strarray_find_dest(char **array, const TEXT_DEST_REC *dest)
+{
+       g_return_val_if_fail(array != NULL, FALSE);
+
+       if (strarray_find(array, dest->target) != -1)
+               return TRUE;
+
+       if (dest->server_tag != NULL) {
+               char *tagtarget = g_strdup_printf("%s/%s", dest->server_tag, dest->target);
+               int ret = strarray_find(array, tagtarget);
+               g_free(tagtarget);
+               if (ret != -1)
+                       return TRUE;
+       }
+       return FALSE;
+}