Merged with Irssi 0.8.6.
authorPekka Riikonen <priikone@silcnet.org>
Wed, 27 Nov 2002 17:45:30 +0000 (17:45 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Wed, 27 Nov 2002 17:45:30 +0000 (17:45 +0000)
33 files changed:
CHANGES
apps/irssi/configure.in
apps/irssi/docs/Makefile.am
apps/irssi/docs/signals.txt
apps/irssi/docs/special_vars.txt
apps/irssi/src/common.h
apps/irssi/src/core/chat-commands.c
apps/irssi/src/core/commands.c
apps/irssi/src/core/commands.h
apps/irssi/src/core/log.c
apps/irssi/src/core/log.h
apps/irssi/src/core/misc.c
apps/irssi/src/core/misc.h
apps/irssi/src/core/servers-reconnect.c
apps/irssi/src/core/special-vars.c
apps/irssi/src/fe-common/core/chat-completion.c
apps/irssi/src/fe-common/core/chat-completion.h
apps/irssi/src/fe-common/core/fe-log.c
apps/irssi/src/fe-common/core/fe-windows.c
apps/irssi/src/fe-common/core/window-commands.c
apps/irssi/src/fe-text/gui-readline.c
apps/irssi/src/fe-text/textbuffer-commands.c
apps/irssi/src/perl/common/Core.xs
apps/irssi/src/perl/common/Expando.xs
apps/irssi/src/perl/common/Irssi.xs
apps/irssi/src/perl/common/module.h
apps/irssi/src/perl/perl-common.h
apps/irssi/src/perl/perl-signals.h
apps/irssi/src/perl/perl-sources.c
apps/irssi/src/perl/perl-sources.h
apps/irssi/src/perl/textui/TextUI.xs
apps/irssi/src/perl/ui/UI.xs
apps/irssi/src/perl/ui/Window.xs

diff --git a/CHANGES b/CHANGES
index 80f173abe1156df24f684d9abadb8abf390a955e..40c9f080b1e230d091c768c38b99ae2ea59ede38 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -11,6 +11,8 @@ Wed Nov 27 16:01:11 CET 2002  Pekka Riikonen <priikone@silcnet.org>
        * Fixed bugs in invite list handling in INVITE command.
          Affected files silcd/command.c and silcd/server_util.c.
 
+       * Merged with Irssi 0.8.6.
+
 Mon Nov 25 18:21:43 EET 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * The silc_argument_get_[first/next] now return the argument
index 4333bcb4f9a174844063362c195011b621618f93..51ccc718191a0efe5bf14c766f03ccf124493645 100644 (file)
@@ -7,7 +7,7 @@ if test -n "`grep '^#undef VERSION' config.h.in`"; then
 fi
 
 AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(Irssi-SILC, 0.8.6)
+AM_INIT_AUTOMAKE(Irssi-SILC, 0.8.6+)
 
 AM_MAINTAINER_MODE
 
@@ -245,6 +245,35 @@ AC_DEFINE(socklen_t, int, Define to 'int' if <sys/socket.h> doesn't define.)
 fi
 AC_MSG_RESULT($irssi_cv_type_socklen_t)
 
+dnl * off_t checks, try to make it 64bit
+AC_DEFINE_UNQUOTED(_FILE_OFFSET_BITS, $preferred_off_t_bits)
+
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(long)
+AC_CHECK_SIZEOF(long long)
+
+if test $sizeof_off_t = 8; then
+  offt_64bit=yes
+else
+  offt_64bit=no
+fi
+                
+if test x$sizeof_off_t = x$ac_cv_sizeof_long; then
+  # try to use unsigned long always first
+  AC_DEFINE_UNQUOTED(PRIuUOFF_T, "lu")
+  AC_DEFINE(UOFF_T_LONG)
+elif test x$sizeof_off_t = x$ac_cv_sizeof_int; then
+  # next try int
+  AC_DEFINE_UNQUOTED(PRIuUOFF_T, "u")
+  AC_DEFINE(UOFF_T_INT)
+elif test x$sizeof_off_t = x$ac_cv_sizeof_long_long; then
+  # and finally long long
+  AC_DEFINE_UNQUOTED(PRIuUOFF_T, "llu")
+  AC_DEFINE(UOFF_T_LONG_LONG)
+else                    
+  AC_ERROR([Couldn't find integer type for off_t])
+fi
+
 dnl **
 dnl ** check for socks
 dnl **
index f3d02a5ae17e66c871a96321331da061166535a6..e2ff29c3e40860f7658aa2fb1cd0fa3ac50d283c 100644 (file)
@@ -2,7 +2,8 @@ include $(top_srcdir)/Makefile.defines.in
 
 docdir = $(silc_docdir)
 
-doc_DATA = signals.txt formats.txt manual.txt startup-HOWTO.html
+doc_DATA = signals.txt formats.txt manual.txt startup-HOWTO.html \
+       special_vars.txt
 #      faq.txt
 #      startup-HOWTO.txt
 
index 2bf0d9213105238597826963ed856b6ada2b618d..df582873684ceb8a2429812ddff940d0398c4337 100644 (file)
@@ -153,7 +153,7 @@ mode-lists.c:
 
 modes.c:
  "channel mode changed", CHANNEL_REC, char *setby
- "nick mode changed", CHANNEL_REC, NICK_REC, char *setby
+ "nick mode changed", CHANNEL_REC, NICK_REC, char *setby, char *mode, char *type
  "user mode changed", SERVER_REC, char *old
  "away mode changed", SERVER_REC
 
@@ -319,8 +319,8 @@ dcc/fe-dcc-chat-messages.c:
 Text FE
 -------
 
+gui-readline.c:
+ "gui key pressed", int key
+
 gui-printtext.c:
  "beep"
-
-statusbar-items.c:
- "mail counter"
index 7b6640effe2bb8ece0ec688c04dc826a58065537..2008931ff8bb0c9388c721f2fc380a810e1b29f6 100644 (file)
@@ -81,17 +81,19 @@ $A .. $Z is important.
    $$         a literal '$'
 
    $versiontim          prints time of the irssi version in HHMM format
-   $sysname            system name (eg. Linux)
-   $sysrelease         system release (eg. 2.2.18)
-   $sysarch            system architecture (eg. i686)
-   $topic              channel topic
-   $usermode           user mode
-   $cumode             own channel user mode
-   $cumode_space       like $cumode, but gives space if there's no mode.
-   $tag                        server tag
-   $chatnet            chat network of server
-   $winref             window reference number
-   $winname            window name
+   $sysname             system name (eg. Linux)
+   $sysrelease          system release (eg. 2.2.18)
+   $sysarch             system architecture (eg. i686)
+   $topic               channel topic
+   $usermode            user mode
+   $cumode              own channel user mode
+   $cumode_space        like $cumode, but gives space if there's no mode.
+   $tag                 server tag
+   $chatnet             chat network of server
+   $winref              window reference number
+   $winname             window name
+   $itemname            like $T, but use item's visible_name which may be
+                        different (eg. $T = !12345chan, $itemname = !chan)
 
 For example, assume you have the following alias:
 
index ed25e6981646c8c67568bba715ba52bc7cf39371..b88cd9da9af7ddcbc1a7588f241f98862dda9384 100644 (file)
 #  include <gmodule.h>
 #endif
 
+#if defined (UOFF_T_INT)
+typedef unsigned int uoff_t;
+#elif defined (UOFF_T_LONG)
+typedef unsigned long uoff_t;
+#elif defined (UOFF_T_LONGLONG)
+typedef unsigned long long uoff_t;
+#else
+#  error uoff_t size not set
+#endif
+
 /* input functions */
 #define G_INPUT_READ   (1 << 0)
 #define G_INPUT_WRITE  (1 << 1)
index aff0d8b77ad446bc0258772ac5868b9751aa241b..16c3a0e90c7d512e8d62db29d22f5147564869df 100644 (file)
@@ -112,7 +112,8 @@ static SERVER_CONNECT_REC *get_server_connect(const char *data, int *plus_addr,
         return conn;
 }
 
-/* SYNTAX: CONNECT [-4 | -6] [-ssl] [-ircnet <ircnet>] [-host <hostname>]
+/* SYNTAX: CONNECT [-4 | -6] [-ssl] [-noproxy] [-ircnet <ircnet>]
+                   [-host <hostname>] [-rawlog <file>]
                    <address>|<chatnet> [<port> [<password> [<nick>]]] */
 static void cmd_connect(const char *data)
 {
@@ -213,7 +214,8 @@ static void sig_default_command_server(const char *data, SERVER_REC *server,
         signal_emit("command server connect", 3, data, server, item);
 }
 
-/* SYNTAX: SERVER [-4 | -6] [-ssl] [-ircnet <ircnet>] [-host <hostname>]
+/* SYNTAX: SERVER [-4 | -6] [-ssl] [-noproxy] [-ircnet <ircnet>]
+                  [-host <hostname>] [-rawlog <file>]
                   [+]<address>|<chatnet> [<port> [<password> [<nick>]]] */
 static void cmd_server_connect(const char *data, SERVER_REC *server)
 {
index 0669ddedda51a6915b15243682ace08e5e3151e3..bfe3373cf9aa6bf05e09c4d2fef975188baa39ba 100644 (file)
@@ -483,7 +483,7 @@ char *cmd_get_param(char **data)
        return pos;
 }
 
-static char *cmd_get_quoted_param(char **data)
+char *cmd_get_quoted_param(char **data)
 {
        char *pos, quote;
 
@@ -497,7 +497,8 @@ static char *cmd_get_quoted_param(char **data)
        quote = **data; (*data)++;
 
        pos = *data;
-       while (**data != '\0' && (**data != quote || (*data)[1] != ' ')) {
+       while (**data != '\0' && (**data != quote ||
+                                 ((*data)[1] != ' ' && (*data)[1] != '\0'))) {
                if (**data == '\\' && (*data)[1] != '\0')
                         g_memmove(*data, (*data)+1, strlen(*data));
                (*data)++;
index 1733c589e4debbfacaea7f3881474934e928f924..0b599f54c2c09e429eb99a1f73bd1c36b22f3fdf 100644 (file)
@@ -150,6 +150,7 @@ int command_have_option(const char *cmd, const char *option);
 #define PARAM_FLAG_OPTCHAN_NAME (0x00020000|PARAM_FLAG_OPTCHAN)
 
 char *cmd_get_param(char **data);
+char *cmd_get_quoted_param(char **data);
 /* get parameters from command - you should point free_me somewhere and
    cmd_params_free() it after you don't use any of the parameters anymore.
 
index e17f5c568686f6bb2d2030de8bde46379e8e7acb..75768601839e558bb29d471e52ba10c53363a0fb 100644 (file)
@@ -47,6 +47,7 @@ static const char *log_item_types[] = {
 
 const char *log_timestamp;
 static int log_file_create_mode;
+static int log_dir_create_mode;
 static int rotate_tag;
 
 static int log_item_str2type(const char *type)
@@ -116,7 +117,7 @@ int log_start_logging(LOG_REC *log)
                /* path may contain variables (%time, $vars),
                   make sure the directory is created */
                dir = g_dirname(log->real_fname);
-               mkpath(dir, LOG_DIR_CREATE_MODE);
+               mkpath(dir, log_dir_create_mode);
                g_free(dir);
        }
 
@@ -557,6 +558,11 @@ static void read_settings(void)
 {
        log_timestamp = settings_get_str("log_timestamp");
        log_file_create_mode = octal2dec(settings_get_int("log_create_mode"));
+
+        log_dir_create_mode = log_file_create_mode;
+        if (log_file_create_mode & 0400) log_dir_create_mode |= 0100;
+        if (log_file_create_mode & 0040) log_dir_create_mode |= 0010;
+        if (log_file_create_mode & 0004) log_dir_create_mode |= 0001;
 }
 
 void log_init(void)
index da97fb2c341f60940c480729292e37892e974dec..fae872c7fce3ecfe68e7535dbf32f58b3ffc0e5a 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef __LOG_H
 #define __LOG_H
 
-#define LOG_DIR_CREATE_MODE 0700
-
 enum {
        LOG_ITEM_TARGET, /* channel, query, .. */
        LOG_ITEM_WINDOW_REFNUM
index 886c40f1bbbffa0170b6c85ffd4790f83ac3b451..00f9d096b394fbf12cef0c9e0277fad1f53857af 100644 (file)
@@ -592,6 +592,20 @@ int dec2octal(int decimal)
        return octal;
 }
 
+/* string -> uoff_t */
+uoff_t str_to_uofft(const char *str)
+{
+       uoff_t ret;
+
+       ret = 0;
+       while (*str != '\0') {
+               ret = ret*10 + (*str - '0');
+               str++;
+       }
+
+       return ret;
+}
+
 /* convert all low-ascii (<32) to ^<A..> combinations */
 char *show_lowascii(const char *channel)
 {
index b9002c1ce200952bf0e4f043e03c6d2905b56cdc..959460778a62a1f011eedddb247967ae7cd28ede 100644 (file)
@@ -85,6 +85,9 @@ char *replace_chars(char *str, char from, char to);
 int octal2dec(int octal);
 int dec2octal(int decimal);
 
+/* string -> uoff_t */
+uoff_t str_to_uofft(const char *str);
+
 /* convert all low-ascii (<32) to ^<A..> combinations */
 char *show_lowascii(const char *channel);
 
index cc053150dc012ee7ae27bd6befdee133bd6ec229..c7b5dd45291c960bec1386833dd619e4cf0e4651 100644 (file)
@@ -34,6 +34,7 @@ GSList *reconnects;
 static int last_reconnect_tag;
 static int reconnect_timeout_tag;
 static int reconnect_time;
+static int connect_timeout;
 
 void reconnect_save_status(SERVER_CONNECT_REC *conn, SERVER_REC *server)
 {
@@ -92,14 +93,28 @@ void server_reconnect_destroy(RECONNECT_REC *rec)
 static int server_reconnect_timeout(void)
 {
        SERVER_CONNECT_REC *conn;
-       GSList *list, *tmp;
+       GSList *list, *tmp, *next;
        time_t now;
 
+       now = time(NULL);
+
+       /* timeout any connections that haven't gotten to connected-stage */
+       for (tmp = servers; tmp != NULL; tmp = next) {
+               SERVER_REC *server = tmp->data;
+
+               next = tmp->next;
+               if (!server->connected &&
+                   server->connect_time + connect_timeout < now &&
+                   connect_timeout > 0) {
+                       server->connection_lost = TRUE;
+                       server_disconnect(server);
+               }
+       }
+
        /* If server_connect() removes the next reconnection in queue,
           we're screwed. I don't think this should happen anymore, but just
           to be sure we don't crash, do this safely. */
        list = g_slist_copy(reconnects);
-       now = time(NULL);
        for (tmp = list; tmp != NULL; tmp = tmp->next) {
                RECONNECT_REC *rec = tmp->data;
 
@@ -447,11 +462,13 @@ static void sig_chat_protocol_deinit(CHAT_PROTOCOL_REC *proto)
 static void read_settings(void)
 {
        reconnect_time = settings_get_int("server_reconnect_time");
+        connect_timeout = settings_get_int("server_connect_timeout");
 }
 
 void servers_reconnect_init(void)
 {
        settings_add_int("server", "server_reconnect_time", 300);
+       settings_add_int("server", "server_connect_timeout", 300);
 
        reconnects = NULL;
        last_reconnect_tag = 0;
index f7d69728c466d4fe41c60d02f2506d0c233cef72..6906664207a379b318849441bba558dfda383826 100644 (file)
@@ -391,7 +391,7 @@ char *parse_special(char **cmd, SERVER_REC *server, void *item,
        }
 
        nest_free = FALSE; nest_value = NULL;
-       if (**cmd == '(') {
+       if (**cmd == '(' && (*cmd)[1] != '\0') {
                /* subvariable */
                int toplevel = nested_orig_cmd == NULL;
 
@@ -407,6 +407,9 @@ char *parse_special(char **cmd, SERVER_REC *server, void *item,
                                                   flags);
                }
 
+               if (nest_value == NULL || *nest_value == '\0')
+                       return NULL;
+
                while ((*nested_orig_cmd)[1] != '\0') {
                        (*nested_orig_cmd)++;
                        if (**nested_orig_cmd == ')')
@@ -421,6 +424,8 @@ char *parse_special(char **cmd, SERVER_REC *server, void *item,
                brackets = FALSE;
        else {
                /* special value is inside {...} (foo${test}bar -> fooXXXbar) */
+               if ((*cmd)[1] == '\0')
+                       return NULL;
                (*cmd)++;
                brackets = TRUE;
        }
index f64dca65f8a242d439fff0ce7107bd87d505ac0b..803700de521465f49d22e08de10d20b48b77a15f 100644 (file)
@@ -299,7 +299,7 @@ static GList *convert_msglist(GSList *msglist)
 }
 
 /* Complete /MSG - if `find_server' is NULL, complete nicks from all servers */
-static GList *completion_msg(SERVER_REC *win_server,
+GList *completion_msg(SERVER_REC *win_server,
                             SERVER_REC *find_server,
                             const char *nick, const char *prefix)
 {
index ff6098b15761fa7adbfc715650ee788909b60b09..17c1408dcf8e70dc458975d2f9262e63d68e770f 100644 (file)
@@ -6,6 +6,8 @@ GList *completion_get_servers(const char *word);
 GList *completion_get_servertags(const char *word);
 GList *completion_get_channels(SERVER_REC *server, const char *word);
 GList *completion_get_aliases(const char *word);
+GList *completion_msg(SERVER_REC *win_server, SERVER_REC *find_server,
+                            const char *nick, const char *prefix);
 
 void completion_last_message_add(const char *nick);
 void completion_last_message_remove(const char *nick);
index 215d4a52f8b32cd4f44ecd975be236e2d318210f..1db74fe11a0d2b73722960c456d8fdaf1c34a83d 100644 (file)
@@ -48,6 +48,8 @@ static THEME_REC *log_theme;
 static int skip_next_printtext;
 static const char *log_theme_name;
 
+static int log_dir_create_mode;
+
 static char *log_colorizer_strip(const char *str)
 {
         return strip_codes(str);
@@ -438,7 +440,7 @@ static void autolog_open(SERVER_REC *server, const char *server_tag,
                log_item_add(log, LOG_ITEM_TARGET, target, server_tag);
 
                dir = g_dirname(log->real_fname);
-               mkpath(dir, LOG_DIR_CREATE_MODE);
+               mkpath(dir, log_dir_create_mode);
                g_free(dir);
 
                log->temp = TRUE;
@@ -665,6 +667,7 @@ static void sig_theme_destroyed(THEME_REC *theme)
 static void read_settings(void)
 {
        int old_autolog = autolog_level;
+        int log_file_create_mode;
 
        autolog_path = settings_get_str("autolog_path");
        autolog_level = !settings_get_bool("autolog") ? 0 :
@@ -684,6 +687,12 @@ static void read_settings(void)
 
        log_theme = log_theme_name == NULL ? NULL :
                theme_load(log_theme_name);
+
+       log_file_create_mode = octal2dec(settings_get_int("log_create_mode"));
+        log_dir_create_mode = log_file_create_mode;
+        if (log_file_create_mode & 0400) log_dir_create_mode |= 0100;
+        if (log_file_create_mode & 0040) log_dir_create_mode |= 0010;
+        if (log_file_create_mode & 0004) log_dir_create_mode |= 0001;
 }
 
 void fe_log_init(void)
index 24a32a51e7ab0fa4f94d661d832da2e6d49e3d9a..dc264d657a5ac47a7433f0395d8fc8e80cb6e92b 100644 (file)
@@ -268,46 +268,66 @@ const char *window_get_active_name(WINDOW_REC *window)
 WINDOW_REC *window_find_level(void *server, int level)
 {
        GSList *tmp;
+       WINDOW_REC *match;
 
-        /* prefer active window if possible */
-       if (active_win != NULL &&
-           WINDOW_LEVEL_MATCH(active_win, server, level))
-                return active_win;
-
+       match = NULL;
        for (tmp = windows; tmp != NULL; tmp = tmp->next) {
                WINDOW_REC *rec = tmp->data;
 
-               if (WINDOW_LEVEL_MATCH(rec, server, level))
-                        return rec;
+               if (WINDOW_LEVEL_MATCH(rec, server, level)) {
+                       /* prefer windows without any items */
+                       if (rec->items == NULL)
+                               return rec;
+
+                       if (match == NULL)
+                               match = rec;
+                       else if (active_win == rec) {
+                               /* prefer active window over others */
+                               match = rec;
+                       }
+               }
        }
 
-       return NULL;
+       return match;
 }
 
 WINDOW_REC *window_find_closest(void *server, const char *name, int level)
 {
        WINDOW_REC *window,*namewindow=NULL;
        WI_ITEM_REC *item;
+       int i;
 
        /* match by name */
        item = name == NULL ? NULL :
                window_item_find(server, name);
        if (item != NULL) {
                namewindow = window_item_window(item);
-               if (namewindow != NULL && ((namewindow->level & level) != 0 ||
-                   !settings_get_bool("window_check_level_first")))
-                 return namewindow;
+               if (namewindow != NULL &&
+                   ((namewindow->level & level) != 0 ||
+                    !settings_get_bool("window_check_level_first"))) {
+                       /* match, but if multiple windows have the same level
+                          we could be choosing a bad one here, eg.
+                          name=nick1 would get nick2's query instead of
+                          generic msgs window. */
+                       if (g_strcasecmp(name, item->visible_name) == 0)
+                               return namewindow;
+               }
        }
 
-       /* match by level */
-       if (level != MSGLEVEL_HILIGHT)
-               level &= ~(MSGLEVEL_HILIGHT | MSGLEVEL_NOHILIGHT);
-       window = window_find_level(server, level);
-       if (window != NULL) return window;
-
-       /* match by level - ignore server */
-       window = window_find_level(NULL, level);
-       if (window != NULL) return window;
+       /* prefer windows without items */
+       for (i = 0; i < 2; i++) {
+               /* match by level */
+               if (level != MSGLEVEL_HILIGHT)
+                       level &= ~(MSGLEVEL_HILIGHT | MSGLEVEL_NOHILIGHT);
+               window = window_find_level(server, level);
+               if (window != NULL && (i == 1 || window->items == NULL))
+                       return window;
+
+               /* match by level - ignore server */
+               window = window_find_level(NULL, level);
+               if (window != NULL && (i == 1 || window->items == NULL))
+                       return window;
+       }
 
        /* still return item's window if we didnt find anything */
        if (namewindow != NULL) return namewindow;
index a8f3bb1066bd2835023e03842e73572d858c2f85..fbfacd8540964dd4e1074b44eb9fc4d2220f1820 100644 (file)
@@ -531,7 +531,10 @@ static void cmd_window_number(const char *data)
 /* SYNTAX: WINDOW NAME <name> */
 static void cmd_window_name(const char *data)
 {
-       if (window_find_name(data) == NULL)
+       WINDOW_REC *win;
+
+       win = window_find_name(data);
+       if (win == NULL || win == active_win)
                window_set_name(active_win, data);
        else if (active_win->name == NULL ||
                 strcmp(active_win->name, data) != 0) {
index 1cabfac72b634e77e804139e1619e97cc7b97600..66867ffb7de0924074087efaf629eacbe806e4ab 100644 (file)
@@ -81,10 +81,10 @@ static void handle_key_redirect(int key)
        data = redir->data;
        g_free_and_null(redir);
 
+       gui_entry_set_prompt(active_entry, "");
+
        if (func != NULL)
                func(key, data, active_win->active_server, active_win->active);
-
-       gui_entry_set_prompt(active_entry, "");
 }
 
 static void handle_entry_redirect(const char *line)
@@ -98,12 +98,12 @@ static void handle_entry_redirect(const char *line)
        data = redir->data;
        g_free_and_null(redir);
 
+       gui_entry_set_prompt(active_entry, "");
+
        if (func != NULL) {
                func(line, data, active_win->active_server,
                     active_win->active);
        }
-
-       gui_entry_set_prompt(active_entry, "");
 }
 
 static int get_scroll_count(void)
@@ -134,17 +134,20 @@ static void window_next_page(void)
        gui_window_scroll(active_win, get_scroll_count());
 }
 
-void handle_key(unichar key)
+static void sig_gui_key_pressed(gpointer keyp)
 {
+        unichar key;
        char str[20];
 
-       idle_time = time(NULL);
+       key = GPOINTER_TO_INT(keyp);
 
        if (redir != NULL && redir->flags & ENTRY_REDIRECT_FLAG_HOTKEY) {
                handle_key_redirect(key);
                return;
        }
 
+       idle_time = time(NULL);
+
        if (key < 32) {
                /* control key */
                 str[0] = '^';
@@ -367,8 +370,10 @@ static void sig_input(void)
                if (!term_detached)
                        signal_emit("command quit", 1, "Lost terminal");
        } else {
-               for (i = 0; i < ret; i++)
-                       handle_key(buffer[i]);
+               for (i = 0; i < ret; i++) {
+                       signal_emit("gui key pressed", 1,
+                                   GINT_TO_POINTER(buffer[i]));
+               }
        }
 }
 
@@ -762,6 +767,7 @@ void gui_readline_init(void)
 
        signal_add("window changed automatic", (SIGNAL_FUNC) sig_window_auto_changed);
        signal_add("gui entry redirect", (SIGNAL_FUNC) sig_gui_entry_redirect);
+       signal_add("gui key pressed", (SIGNAL_FUNC) sig_gui_key_pressed);
 }
 
 void gui_readline_deinit(void)
@@ -825,4 +831,5 @@ void gui_readline_deinit(void)
 
        signal_remove("window changed automatic", (SIGNAL_FUNC) sig_window_auto_changed);
        signal_remove("gui entry redirect", (SIGNAL_FUNC) sig_gui_entry_redirect);
+       signal_remove("gui key pressed", (SIGNAL_FUNC) sig_gui_key_pressed);
 }
index 61350a3ee35f3346816d5a33cc29dff989181ff3..92eaaec700dba9700fc169d512f29cad55606865 100644 (file)
@@ -232,7 +232,9 @@ static void cmd_scrollback_end(const char *data)
         TEXT_BUFFER_VIEW_REC *view;
 
        view = WINDOW_GUI(active_win)->view;
-       if (view->bottom_startline == NULL)
+       if (view->bottom_startline == NULL ||
+           (view->bottom_startline == view->startline &&
+            view->bottom_subline == view->subline))
                return;
 
        textbuffer_view_scroll_line(view, view->bottom_startline);
index c3fd41ba91bf45b44ddc9660e7ad9c943520aed8..d5b9d6e80789d6b7f198f6804a42554833b57959 100644 (file)
@@ -2,6 +2,8 @@
 #include "irssi-version.h"
 #include "core.h"
 
+#include "pidwait.h"
+
 #define DEFAULT_COMMAND_CATEGORY "Perl scripts' commands"
 
 void perl_signal_add_hash(int priority, SV *sv)
@@ -242,7 +244,7 @@ input_add(source, condition, func, data)
        SV *func
        SV *data
 CODE:
-       RETVAL = perl_input_add(source, condition, func, data);
+       RETVAL = perl_input_add(source, condition, func, data, FALSE);
 OUTPUT:
        RETVAL
 
index d3a232f7c4e66d85495dcfe5ea48dc7eb49c2260..08f5c202214e537f9b2c14a4c4d4f8c590b41863 100644 (file)
@@ -71,13 +71,13 @@ static char *perl_expando_event(PerlExpando *rec, SERVER_REC *server,
        retcount = perl_call_sv(rec->func, G_EVAL|G_SCALAR);
        SPAGAIN;
 
+       ret = NULL;
        if (SvTRUE(ERRSV)) {
                /* make sure we don't get back here */
                if (rec->script != NULL)
                        script_unregister_expandos(rec->script);
 
                signal_emit("script error", 2, rec->script, SvPV(ERRSV, PL_na));
-               ret = NULL;
        } else if (retcount > 0) {
                ret = g_strdup(POPp);
                *free_ret = TRUE;
index 328e32d33e0d70f86a01bc542dca20e3094ea1c2..d0e8242566127df92852286f42f2c17ee48a0350 100644 (file)
@@ -2,6 +2,12 @@
 
 static int initialized = FALSE;
 
+void perl_expando_init(void);
+void perl_expando_deinit(void);
+
+void perl_settings_init(void);
+void perl_settings_deinit(void);
+
 MODULE = Irssi  PACKAGE = Irssi
 
 PROTOTYPES: ENABLE
index 5456f6300414a57f9932ed1237c98a647244e37f..07ecc56f698eda31d7037af51ad10381c1d72ab0 100644 (file)
@@ -26,6 +26,7 @@
 #include "perl/perl-core.h"
 #include "perl/perl-common.h"
 #include "perl/perl-signals.h"
+#include "perl/perl-sources.h"
 
 typedef COMMAND_REC *Irssi__Command;
 typedef LOG_REC *Irssi__Log;
index cef0036ff12f2b9c35cad3985660208ef8894ce5..32e6e6559f390c379b7515d9f90e9cff2b0e3936 100644 (file)
@@ -64,6 +64,16 @@ void irssi_add_plains(PLAIN_OBJECT_INIT_REC *objects);
 
 char *perl_get_use_list(void);
 
+void perl_command(const char *cmd, SERVER_REC *server, WI_ITEM_REC *item);
+
+void perl_chatnet_fill_hash(HV *hv, CHATNET_REC *chatnet);
+void perl_connect_fill_hash(HV *hv, SERVER_CONNECT_REC *conn);
+void perl_server_fill_hash(HV *hv, SERVER_REC *server);
+void perl_window_item_fill_hash(HV *hv, WI_ITEM_REC *item);
+void perl_channel_fill_hash(HV *hv, CHANNEL_REC *channel);
+void perl_query_fill_hash(HV *hv, QUERY_REC *query);
+void perl_nick_fill_hash(HV *hv, NICK_REC *nick);
+
 #define irssi_boot(x) { \
        extern void boot_Irssi__##x(pTHX_ CV *cv); \
        irssi_callXS(boot_Irssi__##x, cv, mark); \
index 92196d0484fe7f99ad2486ccdf9feb3eef5eccd7..60e6636e279ab24d0bc68bae5f599e90dc416214 100644 (file)
@@ -18,6 +18,9 @@ void perl_command_bind_to(const char *cmd, const char *category,
 
 void perl_command_unbind(const char *cmd, SV *func);
 
+void perl_command_runsub(const char *cmd, const char *data, 
+                        SERVER_REC *server, WI_ITEM_REC *item);
+
 void perl_signals_start(void);
 void perl_signals_stop(void);
 
index c4d323e6e94e22a20ffa85a4a40cf6ab0c5ebe4c..9379601cc6e9464613da77e237fa1fd2260eed90 100644 (file)
@@ -24,6 +24,7 @@
 
 #include "perl-core.h"
 #include "perl-common.h"
+#include "perl-sources.h"
 
 typedef struct {
         PERL_SCRIPT_REC *script;
index db165689009700d658533968282e16f48234b74a..a83a65a6465b8c328d7fd320ef200353374abe4b 100644 (file)
@@ -1,8 +1,8 @@
 #ifndef __PERL_SOURCES_H
 #define __PERL_SOURCES_H
 
-int perl_timeout_add(int msecs, SV *func, SV *data);
-int perl_input_add(int source, int condition, SV *func, SV *data);
+int perl_timeout_add(int msecs, SV *func, SV *data, int once);
+int perl_input_add(int source, int condition, SV *func, SV *data, int once);
 
 void perl_source_remove(int tag);
 /* remove all sources used by script */
index 4e7db7b23ef9318092ee89b1ca7d67f1a391b6a8..4f23a9a0507a09667dc776227148914e4b72bf02 100644 (file)
@@ -1,5 +1,8 @@
 #include "module.h"
 
+void perl_statusbar_init(void);
+void perl_statusbar_deinit(void);
+
 static int initialized = FALSE;
 
 static void perl_main_window_fill_hash(HV *hv, MAIN_WINDOW_REC *window)
index c2ee46b48b82b3043e6c01d686512bb34f5c1db7..670fb1a598115cbac55422be890314e4f004d670 100644 (file)
@@ -1,5 +1,8 @@
 #include "module.h"
 
+void perl_themes_init(void);
+void perl_themes_deinit(void);
+
 static int initialized = FALSE;
 
 static void perl_process_fill_hash(HV *hv, PROCESS_REC *process)
index 89d874ee7cb88a8bdbb9e160fa828a3f31f998e7..f8ef0315a7533798143eeee5ba4c09b249b50e69 100644 (file)
@@ -1,5 +1,7 @@
 #include "module.h"
 
+#include "window-activity.h"
+
 MODULE = Irssi::UI::Window  PACKAGE = Irssi
 PROTOTYPES: ENABLE