Added SILC Thread Queue API
[runtime.git] / apps / irssi / src / perl / ui / Formats.xs
index 0ad8c86a4ab8ba3a7dd30f75af96c7986269179a..7ff31aac5868e6aafd20b41da60faa9d8ac2b150 100644 (file)
@@ -1,8 +1,77 @@
 #include "module.h"
 
-MODULE = Irssi::UI::Formats  PACKAGE = Irssi::UI::Window
+static int magic_free_text_dest(pTHX_ SV *sv, MAGIC *mg)
+{
+       TEXT_DEST_REC *dest = (TEXT_DEST_REC *) mg->mg_ptr;
+       char *target = (char *) dest->target;
+       g_free(target);
+       g_free(dest);
+       mg->mg_ptr = NULL;
+       sv_setiv(sv, 0);
+       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
@@ -11,17 +80,57 @@ format_get_text(window, module, server, target, formatnum, ...)
        char *target
        int formatnum
 PREINIT:
+       TEXT_DEST_REC dest;
+       THEME_REC *theme;
        char **charargs;
        char *ret;
        int n;
 PPCODE:
        charargs = g_new0(char *, items-5+1);
-       charargs[items-5] = NULL;
         for (n = 5; n < items; n++) {
                charargs[n-5] = (char *)SvPV(ST(n), PL_na);
        }
-       ret = format_get_text(module, window, server, target, formatnum, charargs);
+
+       format_create_dest(&dest, server, target, 0, window);
+       theme = window_get_theme(dest.window);
+
+       ret = format_get_text_theme_charargs(theme, module, &dest, formatnum, charargs);
        g_free(charargs);
 
        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, "%s", str);