updates. silc.server.0.9
authorPekka Riikonen <priikone@silcnet.org>
Wed, 15 May 2002 16:01:16 +0000 (16:01 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Wed, 15 May 2002 16:01:16 +0000 (16:01 +0000)
22 files changed:
CHANGES
apps/irssi/src/common.h
apps/irssi/src/core/chat-protocols.h
apps/irssi/src/core/expandos.c
apps/irssi/src/core/servers-setup.c
apps/irssi/src/fe-common/core/fe-common-core.c
apps/irssi/src/fe-common/core/fe-exec.c
apps/irssi/src/fe-common/core/fe-help.c
apps/irssi/src/fe-common/core/fe-messages.c
apps/irssi/src/fe-common/core/fe-queries.c
apps/irssi/src/fe-common/core/fe-settings.c
apps/irssi/src/fe-common/core/formats.c
apps/irssi/src/fe-text/Makefile.am
apps/irssi/src/fe-text/statusbar.c
apps/irssi/src/fe-text/term-terminfo.c
apps/irssi/src/fe-text/term.c
apps/irssi/src/fe-text/textbuffer-view.c
apps/irssi/src/fe-text/textbuffer.c
apps/irssi/src/perl/common/Core.xs
apps/irssi/src/perl/perl-sources.c
apps/irssi/src/perl/ui/Formats.xs
apps/irssi/src/perl/ui/Themes.xs

diff --git a/CHANGES b/CHANGES
index cf3d67ae8ae538a517812f710265247e65016fb2..bd94e497d9d66c2493ba3ce56f23e0364bfcab57 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+Wed May 15 19:01:42 EEST 2002 Pekka Riikonen <priikone@silcnet.org>
+
+       * Merged with Irssi CVS for Irssi SILC client.
+
 Tue May 14 19:37:48 EEST 2002 Pekka Riikonen <priikone@silcnet.org>
 
        * Completed the protocol specifications.
index bdfec4ec1fdaea942e0445984b66b3c298a3ca32..b65c57a1182909072e4e528735a3718be88535e2 100644 (file)
@@ -1,8 +1,9 @@
 #ifndef __COMMON_H
 #define __COMMON_H
 
-#define IRSSI_AUTHOR "Timo Sirainen <cras@irssi.org>"
 #define IRSSI_WEBSITE "http://irssi.org/"
+#define IRSSI_AUTHOR_EMAIL "cras@irssi.org"
+#define IRSSI_AUTHOR "Timo Sirainen <"IRSSI_AUTHOR_EMAIL">"
 
 #define IRSSI_DIR_SHORT "~/.silc"
 #define IRSSI_DIR_FULL "%s/.silc" /* %s == g_get_home_dir() */
@@ -100,6 +101,7 @@ typedef struct _LINEBUF_REC LINEBUF_REC;
 typedef struct _NET_SENDBUF_REC NET_SENDBUF_REC;
 typedef struct _RAWLOG_REC RAWLOG_REC;
 
+typedef struct _CHAT_PROTOCOL_REC CHAT_PROTOCOL_REC;
 typedef struct _CHATNET_REC CHATNET_REC;
 typedef struct _SERVER_REC SERVER_REC;
 typedef struct _WI_ITEM_REC WI_ITEM_REC;
index eeb0075f33f9bf1ff816364da53713b595f119c6..ad8c64ba6f7905e083ef4cd08226f1ac0a351961 100644 (file)
@@ -1,7 +1,7 @@
 #ifndef __CHAT_PROTOCOLS_H
 #define __CHAT_PROTOCOLS_H
 
-typedef struct {
+struct _CHAT_PROTOCOL_REC {
        int id;
 
        unsigned int not_initialized:1;
@@ -20,7 +20,7 @@ typedef struct {
         SERVER_REC *(*server_connect) (SERVER_CONNECT_REC *);
         CHANNEL_REC *(*channel_create) (SERVER_REC *, const char *, int);
         QUERY_REC *(*query_create) (const char *, const char *, int);
-} CHAT_PROTOCOL_REC;
+};
 
 extern GSList *chat_protocols;
 
index 5cec556185dbf64b6356b5c6545806c7fcd8fca1..2830d6771bd0651ec40713271cd8bba040852e0d 100644 (file)
@@ -538,7 +538,7 @@ void expandos_init(void)
        struct utsname un;
 #endif
        settings_add_str("misc", "STATUS_OPER", "*");
-       settings_add_str("misc", "timestamp_format", "%H:%M");
+       settings_add_str("lookandfeel", "timestamp_format", "%H:%M");
 
        client_start_time = time(NULL);
        last_sent_msg = NULL; last_sent_msg_body = NULL;
index 992f4e0059818962889822866d9ebec72f74b19e..d16f93a7fd4bee3ecf9681968dcd67369f128b55 100644 (file)
@@ -466,6 +466,8 @@ void server_setup_add(SERVER_SETUP_REC *rec)
        if (g_slist_find(setupservers, rec) == NULL)
                setupservers = g_slist_append(setupservers, rec);
        server_setup_save(rec);
+
+       signal_emit("server setup updated", 1, rec);
 }
 
 void server_setup_remove(SERVER_SETUP_REC *rec)
index f356aa287588d3898c914fbbc3c3ac2131af2615..94e18fc1f1c9c611ca4f858f075710d4004ce322 100644 (file)
@@ -161,7 +161,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_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);
index 4b7c9ae0c98c640299e7ae37ec90b6ecada02028..88df56aeeb10c3f781dd38d491dee05ff50850bc 100644 (file)
@@ -47,8 +47,9 @@ static void exec_wi_destroy(EXEC_WI_REC *rec)
         g_return_if_fail(rec != NULL);
 
        if (rec->destroying) return;
-        rec->destroying = TRUE;
+       rec->destroying = TRUE;
 
+       rec->process->target_item = NULL;
        if (window_item_window((WI_ITEM_REC *) rec) != NULL)
                window_item_destroy((WI_ITEM_REC *) rec);
 
@@ -464,10 +465,8 @@ static void handle_exec(const char *args, GHashTable *optlist,
                        g_free_and_null(rec->target);
                        rec->target_win = active_win;
 
-                       if (rec->target_item != NULL) {
+                       if (rec->target_item != NULL)
                                exec_wi_destroy(rec->target_item);
-                                rec->target_item = NULL;
-                       }
 
                        if (interactive) {
                                rec->target_item =
index c087771b1bfde5a875b8feecb5f8e030f9b968d2..84a7635222197d61ee7cb2269ab57193c156188a 100644 (file)
@@ -117,16 +117,27 @@ static void help_category(GSList *cmdlist, int items)
 static int show_help_file(const char *file)
 {
         const char *helppath;
-       char tmpbuf[1024], *str, *path;
+       char tmpbuf[1024], *str, *path, **paths, **tmp;
        LINEBUF_REC *buffer = NULL;
        int f, ret, recvlen;
 
         helppath = settings_get_str("help_path");
 
-       /* helpdir/command or helpdir/category/command */
-       path = g_strdup_printf("%s/%s", helppath, file);
-       f = open(path, O_RDONLY);
-       g_free(path);
+       paths = g_strsplit(helppath, ":", -1);
+
+       f = -1;
+       for (tmp = paths; *tmp != NULL; tmp++) {
+               /* helpdir/command or helpdir/category/command */
+               path = g_strdup_printf("%s/%s", *tmp, file);
+               f = open(path, O_RDONLY);
+               g_free(path);
+
+               if (f != -1)
+                       break;
+
+       }
+
+       g_strfreev(paths);
 
        if (f == -1)
                return FALSE;
index 481301039f2bf4f0203826691831394666fb6ee6..44c9fb35f635c4929c7ecd6c77788aed28d90028 100644 (file)
@@ -152,7 +152,8 @@ static void sig_message_public(SERVER_REC *server, const char *msg,
        if (nickrec == NULL && chanrec != NULL)
                 nickrec = nicklist_find(chanrec, nick);
 
-       for_me = nick_match_msg(chanrec, msg, server->nick);
+       for_me = !settings_get_bool("hilight_nick_matches") ? FALSE :
+               nick_match_msg(chanrec, msg, server->nick);
        color = for_me ? NULL :
                hilight_match_nick(server, target, nick, address, MSGLEVEL_PUBLIC, msg);
 
@@ -624,6 +625,7 @@ void fe_messages_init(void)
        printnicks = g_hash_table_new((GHashFunc) g_direct_hash,
                                      (GCompareFunc) g_direct_equal);
 
+       settings_add_bool("lookandfeel", "hilight_nick_matches", TRUE);
        settings_add_bool("lookandfeel", "emphasis", TRUE);
        settings_add_bool("lookandfeel", "emphasis_replace", FALSE);
        settings_add_bool("lookandfeel", "emphasis_multiword", FALSE);
index c6bfaef24fd1e1e00cf757d2a07356159ef54579..93f1304014c805088abbb128aa9780a172f45b03 100644 (file)
@@ -100,7 +100,7 @@ static void signal_query_destroyed(QUERY_REC *query)
                window_auto_destroy(window);
        else {
                /* eg. connection lost to dcc chat */
-               window_bind_add(window, query->server->tag, query->name);
+               window_bind_add(window, query->server_tag, query->name);
        }
 }
 
index 382a09f742add475bb5df04d1900d4a2c8f2f2fd..70bc5cc3238a8e59e3534aaafb3ec98ff0788771 100644 (file)
@@ -209,6 +209,8 @@ static void alias_remove(const char *alias)
        else {
                printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_ALIAS_REMOVED, alias);
                iconfig_set_str("aliases", alias, NULL);
+
+               signal_emit("alias removed", 1, alias);
        }
 }
 
@@ -230,6 +232,7 @@ static void cmd_alias(const char *data)
        else {
                printformat(NULL, NULL, MSGLEVEL_CLIENTNOTICE, TXT_ALIAS_ADDED, alias);
                iconfig_set_str("aliases", alias, value);
+               signal_emit("alias added", 2, alias, value);
        }
         cmd_params_free(free_arg);
 }
index 6941391e78c6cb7b7bddfdcb4f1b142676139963..983a849e04304c3f7e09135976ec5c1a06d35676 100644 (file)
@@ -38,7 +38,7 @@ static const char *format_fores = "kbgcrmyw";
 static const char *format_boldfores = "KBGCRMYW";
 
 static int signal_gui_print_text;
-static int hide_text_style, hide_server_tags, hide_mirc_colors;
+static int hide_text_style, hide_server_tags, hide_colors;
 
 static int timestamp_level;
 static int timestamp_timeout;
@@ -227,10 +227,8 @@ void format_read_arglist(va_list va, FORMAT_REC *format,
                switch (format->paramtypes[num]) {
                case FORMAT_STRING:
                        arglist[num] = (char *) va_arg(va, char *);
-                       if (arglist[num] == NULL) {
-                               g_warning("format_read_arglist(%s) : parameter %d is NULL", format->tag, num);
+                       if (arglist[num] == NULL)
                                arglist[num] = "";
-                       }
                        break;
                case FORMAT_INT: {
                        int d = (int) va_arg(va, int);
@@ -980,9 +978,9 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
                case 3:
                        /* MIRC color */
                        get_mirc_color((const char **) &ptr,
-                                       hide_mirc_colors || hide_text_style ? NULL : &fgcolor,
-                                       hide_mirc_colors || hide_text_style ? NULL : &bgcolor);
-                       if (!hide_mirc_colors && !hide_text_style)
+                                       hide_colors ? NULL : &fgcolor,
+                                       hide_colors ? NULL : &bgcolor);
+                       if (!hide_colors)
                                flags |= GUI_PRINT_FLAG_MIRC_COLOR;
                        break;
                case 4:
@@ -1079,9 +1077,9 @@ void format_send_to_gui(TEXT_DEST_REC *dest, const char *text)
                        /* ansi color code */
                        ptr = (char *)
                                get_ansi_color(theme, ptr,
-                                              hide_text_style ? NULL : &fgcolor,
-                                              hide_text_style ? NULL : &bgcolor,
-                                              hide_text_style ? NULL : &flags);
+                                              hide_colors ? NULL : &fgcolor,
+                                              hide_colors ? NULL : &bgcolor,
+                                              hide_colors ? NULL : &flags);
                        break;
                }
 
@@ -1102,7 +1100,7 @@ static void read_settings(void)
 
        hide_server_tags = settings_get_bool("hide_server_tags");
        hide_text_style = settings_get_bool("hide_text_style");
-       hide_mirc_colors = settings_get_bool("hide_mirc_colors");
+       hide_colors = hide_text_style || settings_get_bool("hide_colors");
 }
 
 void formats_init(void)
index 6407d8611aa92094059f4d1cc8fc1a7b3ba60f3e..b6a005a228ff1eeaff8d5c3a6558bcf87217b5bb 100644 (file)
@@ -24,6 +24,7 @@ silc_LDADD = \
        @PERL_LINK_FLAGS@ \
        @PROG_LIBS@     \
        -L../../../lib -lsilcclient
+silc_LDFLAGS = -export-dynamic
 
 tparm_sources = \
        tparm.c
index 5ad869980da7308b41383a3713b5788a409323d1..ef62037914b4f2726822f3dc5c358c05b1278206 100644 (file)
@@ -731,6 +731,22 @@ void statusbar_item_default_handler(SBAR_ITEM_REC *item, int get_size_only,
                         /* they're forcing us smaller than minimum size.. */
                        len = format_real_length(tmpstr, item->size);
                         tmpstr[len] = '\0';
+               } else {
+                       /* make sure the str is big enough to fill the
+                          requested size, so it won't corrupt screen */
+                       len = format_get_length(tmpstr);
+                       if (len < item->size) {
+                               char *fill;
+
+                               len = item->size-len;
+                               fill = g_malloc(len + 1);
+                               memset(fill, ' ', len); fill[len] = '\0';
+
+                               tmpstr2 = g_strconcat(tmpstr, fill, NULL);
+                               g_free(fill);
+                               g_free(tmpstr);
+                               tmpstr = tmpstr2;
+                       }
                }
 
                tmpstr2 = update_statusbar_bg(tmpstr, item->bar->color);
index ddb00441d0b81204d5f22cc2391bc7072cea9cae..311b249991d06dd5f79eaef8b6469ec896c0eafd 100644 (file)
@@ -372,13 +372,16 @@ static void term_printed_text(int count)
           However, next term_move() really shouldn't try to cache
           the move, otherwise terminals would try to combine the
           last word in upper line with first word in lower line. */
-        cforcemove = TRUE;
        vcx += count;
        while (vcx >= term_width) {
                vcx -= term_width;
                if (vcy < term_height-1) vcy++;
                if (vcx > 0) term_lines_empty[vcy] = FALSE;
        }
+
+       crealx += count;
+       if (crealx >= term_width)
+               cforcemove = TRUE;
 }
 
 void term_addch(TERM_WINDOW *window, int chr)
@@ -387,15 +390,17 @@ void term_addch(TERM_WINDOW *window, int chr)
 
        if (vcmove) term_move_real();
 
-       /* With UTF-8, move cursor only if this char is either single-byte
-          (8. bit on) or beginning of multibyte (7+8 bits on) */
-       if (term_type != TERM_TYPE_UTF8 ||
-           (chr & 0x80) == 0 || (chr & 0x40) == 0) {
-               term_printed_text(1);
-       }
+       if (vcy < term_height-1 || vcx < term_width-1) {
+               /* With UTF-8, move cursor only if this char is either
+                  single-byte (8. bit off) or beginning of multibyte
+                  (7. bit off) */
+               if (term_type != TERM_TYPE_UTF8 ||
+                   (chr & 0x80) == 0 || (chr & 0x40) == 0) {
+                       term_printed_text(1);
+               }
 
-       if (vcy != term_height || vcx != 0)
                putc(chr, window->term->out);
+       }
 }
 
 static void term_addch_utf8(TERM_WINDOW *window, unichar chr)
@@ -413,10 +418,10 @@ void term_add_unichar(TERM_WINDOW *window, unichar chr)
        if (term_detached) return;
 
        if (vcmove) term_move_real();
-        term_printed_text(1);
-       if (vcy == term_height && vcx == 0)
+       if (vcy == term_height-1 && vcx == term_width-1)
                return; /* last char in screen */
 
+        term_printed_text(1);
        switch (term_type) {
        case TERM_TYPE_UTF8:
                 term_addch_utf8(window, chr);
@@ -486,6 +491,7 @@ void term_refresh(TERM_WINDOW *window)
                terminfo_set_cursor_visible(TRUE);
                 curs_visible = TRUE;
        }
+
        term_set_color(window, ATTR_RESET);
        fflush(window != NULL ? window->term->out : current_term->out);
 }
@@ -493,11 +499,6 @@ void term_refresh(TERM_WINDOW *window)
 void term_refresh_freeze(void)
 {
         freeze_counter++;
-
-       if (!term_detached && curs_visible) {
-               terminfo_set_cursor_visible(FALSE);
-                curs_visible = FALSE;
-       }
 }
 
 void term_refresh_thaw(void)
index 94d81cfd61b214542373cc0a5015ee0cfc85cb2a..03004b10a9e741dfe6812f8482a88991e49a96e1 100644 (file)
@@ -56,6 +56,9 @@ int term_get_size(int *width, int *height)
        if (ioctl(0, TIOCGWINSZ, &ws) < 0)
                return FALSE;
 
+       if (ws.ws_row == 0 && ws.ws_col == 0)
+               return FALSE;
+
        *width = ws.ws_col;
         *height = ws.ws_row;
 
index dc21aae67cf30c87979382ee250be13a3d9b95bf..da69734e6e6e2e1a27dd7299b69fe9ef75862969 100644 (file)
@@ -18,6 +18,8 @@
     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
+#define        G_LOG_DOMAIN "TextBufferView"
+
 #include "module.h"
 #include "textbuffer-view.h"
 #include "utf8.h"
@@ -713,6 +715,9 @@ static int view_scroll(TEXT_BUFFER_VIEW_REC *view, LINE_REC **lines,
                         break;
                }
 
+               if ((*lines)->next == NULL)
+                       break;
+
                 *lines = (*lines)->next;
        }
 
@@ -879,8 +884,8 @@ LINE_CACHE_REC *textbuffer_view_get_line_cache(TEXT_BUFFER_VIEW_REC *view,
 {
        LINE_CACHE_REC *cache;
 
-        g_return_val_if_fail(view != NULL, NULL);
-        g_return_val_if_fail(line != NULL, NULL);
+        g_assert(view != NULL);
+        g_assert(line != NULL);
 
        cache = g_hash_table_lookup(view->cache->line_cache, line);
        if (cache == NULL)
index ee11aa67a738acba090b9a7e8d57ea78f5b25742..e989b8fda140c853ed205a6f71dc91e415039ba5 100644 (file)
@@ -18,6 +18,8 @@
     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
+#define        G_LOG_DOMAIN "TextBuffer"
+
 #include "module.h"
 #include "misc.h"
 #include "formats.h"
index 0fb93efb58662dbd86713ba21b11463297e15707..129b208118289eaf0691138354b0cc179cc295b4 100644 (file)
@@ -193,7 +193,22 @@ CODE:
                croak("Irssi::timeout() : msecs must be >= 10");
                RETVAL = -1;
        } else {
-               RETVAL = perl_timeout_add(msecs, func, data);
+               RETVAL = perl_timeout_add(msecs, func, data, FALSE);
+       }
+OUTPUT:
+       RETVAL
+
+int
+timeout_add_once(msecs, func, data)
+       int msecs
+       SV *func
+       SV *data
+CODE:
+       if (msecs < 10) {
+               croak("Irssi::timeout_once() : msecs must be >= 10");
+               RETVAL = -1;
+       } else {
+               RETVAL = perl_timeout_add(msecs, func, data, TRUE);
        }
 OUTPUT:
        RETVAL
@@ -430,9 +445,15 @@ int
 level2bits(str)
        char *str
 
-char *
+void
 bits2level(bits)
        int bits
+PREINIT:
+       char *ret;
+PPCODE:
+       ret = bits2level(bits);
+       XPUSHs(sv_2mortal(new_pv(ret)));
+       g_free(ret);
 
 int
 combine_level(level, str)
@@ -498,7 +519,7 @@ void
 pidwait_remove(pid)
        int pid
 
-char *
+void
 parse_special(cmd, data="", flags=0)
        char *cmd
        char *data
index be1a4188714b38ec66439703dc9dd812d4d0d6a5..c4d323e6e94e22a20ffa85a4a40cf6ab0c5ebe4c 100644 (file)
@@ -28,7 +28,8 @@
 typedef struct {
         PERL_SCRIPT_REC *script;
        int tag;
-        int refcount;
+       int refcount;
+       int once; /* run only once */
 
        SV *func;
        SV *data;
@@ -41,14 +42,15 @@ static void perl_source_ref(PERL_SOURCE_REC *rec)
         rec->refcount++;
 }
 
-static void perl_source_unref(PERL_SOURCE_REC *rec)
+static int perl_source_unref(PERL_SOURCE_REC *rec)
 {
        if (--rec->refcount != 0)
-               return;
+               return TRUE;
 
         SvREFCNT_dec(rec->data);
         SvREFCNT_dec(rec->func);
        g_free(rec);
+       return FALSE;
 }
 
 static void perl_source_destroy(PERL_SOURCE_REC *rec)
@@ -64,6 +66,7 @@ static void perl_source_destroy(PERL_SOURCE_REC *rec)
 static int perl_source_event(PERL_SOURCE_REC *rec)
 {
        dSP;
+       int retcount;
 
        ENTER;
        SAVETMPS;
@@ -73,7 +76,7 @@ static int perl_source_event(PERL_SOURCE_REC *rec)
        PUTBACK;
 
         perl_source_ref(rec);
-       perl_call_sv(rec->func, G_EVAL|G_DISCARD);
+       retcount = perl_call_sv(rec->func, G_EVAL|G_SCALAR);
        SPAGAIN;
 
        if (SvTRUE(ERRSV)) {
@@ -81,7 +84,9 @@ static int perl_source_event(PERL_SOURCE_REC *rec)
                signal_emit("script error", 2, rec->script, error);
                 g_free(error);
        }
-        perl_source_unref(rec);
+
+       if (perl_source_unref(rec) && rec->once)
+               perl_source_destroy(rec);
 
        PUTBACK;
        FREETMPS;
@@ -90,7 +95,7 @@ static int perl_source_event(PERL_SOURCE_REC *rec)
        return 1;
 }
 
-int perl_timeout_add(int msecs, SV *func, SV *data)
+int perl_timeout_add(int msecs, SV *func, SV *data, int once)
 {
         PERL_SCRIPT_REC *script;
        PERL_SOURCE_REC *rec;
@@ -103,7 +108,8 @@ int perl_timeout_add(int msecs, SV *func, SV *data)
        rec = g_new0(PERL_SOURCE_REC, 1);
        perl_source_ref(rec);
 
-        rec->script = script;
+       rec->once = once;
+       rec->script = script;
        rec->func = perl_func_sv_inc(func, pkg);
        rec->data = SvREFCNT_inc(data);
        rec->tag = g_timeout_add(msecs, (GSourceFunc) perl_source_event, rec);
@@ -112,7 +118,7 @@ int perl_timeout_add(int msecs, SV *func, SV *data)
        return rec->tag;
 }
 
-int perl_input_add(int source, int condition, SV *func, SV *data)
+int perl_input_add(int source, int condition, SV *func, SV *data, int once)
 {
         PERL_SCRIPT_REC *script;
        PERL_SOURCE_REC *rec;
@@ -126,6 +132,7 @@ int perl_input_add(int source, int condition, SV *func, SV *data)
        rec = g_new0(PERL_SOURCE_REC, 1);
        perl_source_ref(rec);
 
+       rec->once = once;
         rec->script =script;
        rec->func = perl_func_sv_inc(func, pkg);
        rec->data = SvREFCNT_inc(data);
index f9cc02001decba8972481b2f4d170c2a8a3ffa9b..42376f8a64652788f302917c18700931097db871 100644 (file)
@@ -1,8 +1,75 @@
 #include "module.h"
 
-MODULE = Irssi::UI::Formats  PACKAGE = Irssi::UI::Window
+static int magic_free_text_dest(SV *sv, MAGIC *mg)
+{
+       TEXT_DEST_REC *dest = (TEXT_DEST_REC *) mg->mg_ptr;
+       g_free((char *) dest->target);
+       g_free(dest);
+       mg->mg_ptr = NULL;
+       return 0;
+}
+
+static MGVTBL vtbl_free_text_dest =
+{
+    NULL, NULL, NULL, NULL, magic_free_text_dest
+};
+
+static SV *perl_format_create_dest(SERVER_REC *server, char *target,
+                                  int level, WINDOW_REC *window)
+{
+       TEXT_DEST_REC *dest;
+       SV *sv, *ret_sv;
+
+       dest = g_new0(TEXT_DEST_REC, 1);
+       format_create_dest(dest, server, g_strdup(target), level, window);
+
+       ret_sv = plain_bless(dest, "Irssi::UI::TextDest");
+
+       sv = *hv_fetch(hvref(ret_sv), "_irssi", 6, 0);
+       sv_magic(sv, NULL, '~', NULL, 0);
+
+       SvMAGIC(sv)->mg_private = 0x1551; /* HF */
+       SvMAGIC(sv)->mg_virtual = &vtbl_free_text_dest;
+       SvMAGIC(sv)->mg_ptr = (char *) dest;
+
+       return ret_sv;
+}
+
+MODULE = Irssi::UI::Formats  PACKAGE = Irssi
 PROTOTYPES: ENABLE
 
+int
+format_get_length(str)
+       char *str
+
+int
+format_real_length(str, len)
+       char *str
+       int len
+
+void
+strip_codes(input)
+       char *input
+PREINIT:
+       char *ret;
+PPCODE:
+       ret = strip_codes(input);
+       XPUSHs(sv_2mortal(new_pv(ret)));
+       g_free(ret);
+
+
+void
+format_create_dest(target, level=MSGLEVEL_CLIENTNOTICE, window=NULL)
+       char *target
+       int level
+       Irssi::UI::Window window
+PPCODE:
+       XPUSHs(sv_2mortal(perl_format_create_dest(NULL, target, level, window)));
+
+#*******************************
+MODULE = Irssi::UI::Formats  PACKAGE = Irssi::UI::Window
+#*******************************
+
 void
 format_get_text(window, module, server, target, formatnum, ...)
        Irssi::UI::Window window
@@ -30,3 +97,38 @@ PPCODE:
 
        XPUSHs(sv_2mortal(new_pv(ret)));
        g_free_not_null(ret);
+
+#*******************************
+MODULE = Irssi::UI::Formats  PACKAGE = Irssi::Window
+#*******************************
+
+void
+format_create_dest(window=NULL, level=MSGLEVEL_CLIENTNOTICE)
+       Irssi::UI::Window window
+       int level
+PPCODE:
+       XPUSHs(sv_2mortal(perl_format_create_dest(NULL, NULL, level, window)));
+
+#*******************************
+MODULE = Irssi::UI::Formats  PACKAGE = Irssi::Server
+#*******************************
+
+void
+format_create_dest(server, target=NULL, level=MSGLEVEL_CLIENTNOTICE, window=NULL)
+       Irssi::Server server
+       char *target
+       int level
+       Irssi::UI::Window window
+PPCODE:
+       XPUSHs(sv_2mortal(perl_format_create_dest(server, target, level, window)));
+
+#*******************************
+MODULE = Irssi::UI::Formats  PACKAGE = Irssi::UI::TextDest
+#*******************************
+
+void
+print(dest, str)
+       Irssi::UI::TextDest dest
+       char *str
+CODE:
+       printtext_dest(dest, str);
index f452808368711ea3c7337b58e4dfd346f0acfb87..64a0567686e67de6940adfecf429fd32ee5daf66 100644 (file)
@@ -232,7 +232,6 @@ theme_get_format(theme, module, tag)
 PREINIT:
        MODULE_THEME_REC *modtheme;
        FORMAT_REC *formats;
-       char *ret;
        int i;
 CODE:
        formats = g_hash_table_lookup(default_formats, module);