From 63158e7a230236f3fd754c2e43c133bf91807bc5 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Wed, 27 Nov 2002 17:45:30 +0000 Subject: [PATCH] Merged with Irssi 0.8.6. --- CHANGES | 2 + apps/irssi/configure.in | 31 +++++++++- apps/irssi/docs/Makefile.am | 3 +- apps/irssi/docs/signals.txt | 8 +-- apps/irssi/docs/special_vars.txt | 24 ++++---- apps/irssi/src/common.h | 10 ++++ apps/irssi/src/core/chat-commands.c | 6 +- apps/irssi/src/core/commands.c | 5 +- apps/irssi/src/core/commands.h | 1 + apps/irssi/src/core/log.c | 8 ++- apps/irssi/src/core/log.h | 2 - apps/irssi/src/core/misc.c | 14 +++++ apps/irssi/src/core/misc.h | 3 + apps/irssi/src/core/servers-reconnect.c | 21 ++++++- apps/irssi/src/core/special-vars.c | 7 ++- .../src/fe-common/core/chat-completion.c | 2 +- .../src/fe-common/core/chat-completion.h | 2 + apps/irssi/src/fe-common/core/fe-log.c | 11 +++- apps/irssi/src/fe-common/core/fe-windows.c | 60 ++++++++++++------- .../src/fe-common/core/window-commands.c | 5 +- apps/irssi/src/fe-text/gui-readline.c | 23 ++++--- apps/irssi/src/fe-text/textbuffer-commands.c | 4 +- apps/irssi/src/perl/common/Core.xs | 4 +- apps/irssi/src/perl/common/Expando.xs | 2 +- apps/irssi/src/perl/common/Irssi.xs | 6 ++ apps/irssi/src/perl/common/module.h | 1 + apps/irssi/src/perl/perl-common.h | 10 ++++ apps/irssi/src/perl/perl-signals.h | 3 + apps/irssi/src/perl/perl-sources.c | 1 + apps/irssi/src/perl/perl-sources.h | 4 +- apps/irssi/src/perl/textui/TextUI.xs | 3 + apps/irssi/src/perl/ui/UI.xs | 3 + apps/irssi/src/perl/ui/Window.xs | 2 + 33 files changed, 228 insertions(+), 63 deletions(-) diff --git a/CHANGES b/CHANGES index 80f173ab..40c9f080 100644 --- a/CHANGES +++ b/CHANGES @@ -11,6 +11,8 @@ Wed Nov 27 16:01:11 CET 2002 Pekka Riikonen * 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 * The silc_argument_get_[first/next] now return the argument diff --git a/apps/irssi/configure.in b/apps/irssi/configure.in index 4333bcb4..51ccc718 100644 --- a/apps/irssi/configure.in +++ b/apps/irssi/configure.in @@ -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 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 ** diff --git a/apps/irssi/docs/Makefile.am b/apps/irssi/docs/Makefile.am index f3d02a5a..e2ff29c3 100644 --- a/apps/irssi/docs/Makefile.am +++ b/apps/irssi/docs/Makefile.am @@ -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 diff --git a/apps/irssi/docs/signals.txt b/apps/irssi/docs/signals.txt index 2bf0d921..df582873 100644 --- a/apps/irssi/docs/signals.txt +++ b/apps/irssi/docs/signals.txt @@ -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" diff --git a/apps/irssi/docs/special_vars.txt b/apps/irssi/docs/special_vars.txt index 7b6640ef..2008931f 100644 --- a/apps/irssi/docs/special_vars.txt +++ b/apps/irssi/docs/special_vars.txt @@ -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: diff --git a/apps/irssi/src/common.h b/apps/irssi/src/common.h index ed25e698..b88cd9da 100644 --- a/apps/irssi/src/common.h +++ b/apps/irssi/src/common.h @@ -52,6 +52,16 @@ # include #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) diff --git a/apps/irssi/src/core/chat-commands.c b/apps/irssi/src/core/chat-commands.c index aff0d8b7..16c3a0e9 100644 --- a/apps/irssi/src/core/chat-commands.c +++ b/apps/irssi/src/core/chat-commands.c @@ -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 ] [-host ] +/* SYNTAX: CONNECT [-4 | -6] [-ssl] [-noproxy] [-ircnet ] + [-host ] [-rawlog ]
| [ [ []]] */ 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 ] [-host ] +/* SYNTAX: SERVER [-4 | -6] [-ssl] [-noproxy] [-ircnet ] + [-host ] [-rawlog ] [+]
| [ [ []]] */ static void cmd_server_connect(const char *data, SERVER_REC *server) { diff --git a/apps/irssi/src/core/commands.c b/apps/irssi/src/core/commands.c index 0669dded..bfe3373c 100644 --- a/apps/irssi/src/core/commands.c +++ b/apps/irssi/src/core/commands.c @@ -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)++; diff --git a/apps/irssi/src/core/commands.h b/apps/irssi/src/core/commands.h index 1733c589..0b599f54 100644 --- a/apps/irssi/src/core/commands.h +++ b/apps/irssi/src/core/commands.h @@ -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. diff --git a/apps/irssi/src/core/log.c b/apps/irssi/src/core/log.c index e17f5c56..75768601 100644 --- a/apps/irssi/src/core/log.c +++ b/apps/irssi/src/core/log.c @@ -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) diff --git a/apps/irssi/src/core/log.h b/apps/irssi/src/core/log.h index da97fb2c..fae872c7 100644 --- a/apps/irssi/src/core/log.h +++ b/apps/irssi/src/core/log.h @@ -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 diff --git a/apps/irssi/src/core/misc.c b/apps/irssi/src/core/misc.c index 886c40f1..00f9d096 100644 --- a/apps/irssi/src/core/misc.c +++ b/apps/irssi/src/core/misc.c @@ -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 ^ combinations */ char *show_lowascii(const char *channel) { diff --git a/apps/irssi/src/core/misc.h b/apps/irssi/src/core/misc.h index b9002c1c..95946077 100644 --- a/apps/irssi/src/core/misc.h +++ b/apps/irssi/src/core/misc.h @@ -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 ^ combinations */ char *show_lowascii(const char *channel); diff --git a/apps/irssi/src/core/servers-reconnect.c b/apps/irssi/src/core/servers-reconnect.c index cc053150..c7b5dd45 100644 --- a/apps/irssi/src/core/servers-reconnect.c +++ b/apps/irssi/src/core/servers-reconnect.c @@ -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; diff --git a/apps/irssi/src/core/special-vars.c b/apps/irssi/src/core/special-vars.c index f7d69728..69066642 100644 --- a/apps/irssi/src/core/special-vars.c +++ b/apps/irssi/src/core/special-vars.c @@ -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; } diff --git a/apps/irssi/src/fe-common/core/chat-completion.c b/apps/irssi/src/fe-common/core/chat-completion.c index f64dca65..803700de 100644 --- a/apps/irssi/src/fe-common/core/chat-completion.c +++ b/apps/irssi/src/fe-common/core/chat-completion.c @@ -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) { diff --git a/apps/irssi/src/fe-common/core/chat-completion.h b/apps/irssi/src/fe-common/core/chat-completion.h index ff6098b1..17c1408d 100644 --- a/apps/irssi/src/fe-common/core/chat-completion.h +++ b/apps/irssi/src/fe-common/core/chat-completion.h @@ -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); diff --git a/apps/irssi/src/fe-common/core/fe-log.c b/apps/irssi/src/fe-common/core/fe-log.c index 215d4a52..1db74fe1 100644 --- a/apps/irssi/src/fe-common/core/fe-log.c +++ b/apps/irssi/src/fe-common/core/fe-log.c @@ -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) diff --git a/apps/irssi/src/fe-common/core/fe-windows.c b/apps/irssi/src/fe-common/core/fe-windows.c index 24a32a51..dc264d65 100644 --- a/apps/irssi/src/fe-common/core/fe-windows.c +++ b/apps/irssi/src/fe-common/core/fe-windows.c @@ -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; diff --git a/apps/irssi/src/fe-common/core/window-commands.c b/apps/irssi/src/fe-common/core/window-commands.c index a8f3bb10..fbfacd85 100644 --- a/apps/irssi/src/fe-common/core/window-commands.c +++ b/apps/irssi/src/fe-common/core/window-commands.c @@ -531,7 +531,10 @@ static void cmd_window_number(const char *data) /* SYNTAX: WINDOW 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) { diff --git a/apps/irssi/src/fe-text/gui-readline.c b/apps/irssi/src/fe-text/gui-readline.c index 1cabfac7..66867ffb 100644 --- a/apps/irssi/src/fe-text/gui-readline.c +++ b/apps/irssi/src/fe-text/gui-readline.c @@ -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); } diff --git a/apps/irssi/src/fe-text/textbuffer-commands.c b/apps/irssi/src/fe-text/textbuffer-commands.c index 61350a3e..92eaaec7 100644 --- a/apps/irssi/src/fe-text/textbuffer-commands.c +++ b/apps/irssi/src/fe-text/textbuffer-commands.c @@ -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); diff --git a/apps/irssi/src/perl/common/Core.xs b/apps/irssi/src/perl/common/Core.xs index c3fd41ba..d5b9d6e8 100644 --- a/apps/irssi/src/perl/common/Core.xs +++ b/apps/irssi/src/perl/common/Core.xs @@ -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 diff --git a/apps/irssi/src/perl/common/Expando.xs b/apps/irssi/src/perl/common/Expando.xs index d3a232f7..08f5c202 100644 --- a/apps/irssi/src/perl/common/Expando.xs +++ b/apps/irssi/src/perl/common/Expando.xs @@ -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; diff --git a/apps/irssi/src/perl/common/Irssi.xs b/apps/irssi/src/perl/common/Irssi.xs index 328e32d3..d0e82425 100644 --- a/apps/irssi/src/perl/common/Irssi.xs +++ b/apps/irssi/src/perl/common/Irssi.xs @@ -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 diff --git a/apps/irssi/src/perl/common/module.h b/apps/irssi/src/perl/common/module.h index 5456f630..07ecc56f 100644 --- a/apps/irssi/src/perl/common/module.h +++ b/apps/irssi/src/perl/common/module.h @@ -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; diff --git a/apps/irssi/src/perl/perl-common.h b/apps/irssi/src/perl/perl-common.h index cef0036f..32e6e655 100644 --- a/apps/irssi/src/perl/perl-common.h +++ b/apps/irssi/src/perl/perl-common.h @@ -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); \ diff --git a/apps/irssi/src/perl/perl-signals.h b/apps/irssi/src/perl/perl-signals.h index 92196d04..60e6636e 100644 --- a/apps/irssi/src/perl/perl-signals.h +++ b/apps/irssi/src/perl/perl-signals.h @@ -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); diff --git a/apps/irssi/src/perl/perl-sources.c b/apps/irssi/src/perl/perl-sources.c index c4d323e6..9379601c 100644 --- a/apps/irssi/src/perl/perl-sources.c +++ b/apps/irssi/src/perl/perl-sources.c @@ -24,6 +24,7 @@ #include "perl-core.h" #include "perl-common.h" +#include "perl-sources.h" typedef struct { PERL_SCRIPT_REC *script; diff --git a/apps/irssi/src/perl/perl-sources.h b/apps/irssi/src/perl/perl-sources.h index db165689..a83a65a6 100644 --- a/apps/irssi/src/perl/perl-sources.h +++ b/apps/irssi/src/perl/perl-sources.h @@ -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 */ diff --git a/apps/irssi/src/perl/textui/TextUI.xs b/apps/irssi/src/perl/textui/TextUI.xs index 4e7db7b2..4f23a9a0 100644 --- a/apps/irssi/src/perl/textui/TextUI.xs +++ b/apps/irssi/src/perl/textui/TextUI.xs @@ -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) diff --git a/apps/irssi/src/perl/ui/UI.xs b/apps/irssi/src/perl/ui/UI.xs index c2ee46b4..670fb1a5 100644 --- a/apps/irssi/src/perl/ui/UI.xs +++ b/apps/irssi/src/perl/ui/UI.xs @@ -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) diff --git a/apps/irssi/src/perl/ui/Window.xs b/apps/irssi/src/perl/ui/Window.xs index 89d874ee..f8ef0315 100644 --- a/apps/irssi/src/perl/ui/Window.xs +++ b/apps/irssi/src/perl/ui/Window.xs @@ -1,5 +1,7 @@ #include "module.h" +#include "window-activity.h" + MODULE = Irssi::UI::Window PACKAGE = Irssi PROTOTYPES: ENABLE -- 2.24.0