#include "module.h" void printformat_perl(TEXT_DEST_REC *dest, char *format, char **arglist) { THEME_REC *theme; char *module, *str; int formatnum; module = g_strdup(perl_get_package()); formatnum = format_find_tag(module, format); if (formatnum < 0) { die("printformat(): unregistered format '%s'", format); g_free(module); return; } theme = dest->window->theme == NULL ? current_theme : dest->window->theme; signal_emit("print format", 5, theme, module, dest, GINT_TO_POINTER(formatnum), arglist); str = format_get_text_theme_charargs(theme, module, dest, formatnum, arglist); if (*str != '\0') printtext_dest(dest, "%s", str); g_free(str); g_free(module); } static void perl_unregister_theme(const char *package) { FORMAT_REC *formats; int n; formats = g_hash_table_lookup(default_formats, package); if (formats == NULL) return; for (n = 0; formats[n].def != NULL; n++) { g_free(formats[n].tag); g_free(formats[n].def); } g_free(formats); theme_unregister_module(package); } static void sig_script_destroyed(PERL_SCRIPT_REC *script) { perl_unregister_theme(script->package); } void perl_themes_init(void) { signal_add("script destroyed", (SIGNAL_FUNC) sig_script_destroyed); } void perl_themes_deinit(void) { signal_remove("script destroyed", (SIGNAL_FUNC) sig_script_destroyed); } MODULE = Irssi::UI::Themes PACKAGE = Irssi PROTOTYPES: ENABLE Irssi::UI::Theme current_theme() CODE: RETVAL = current_theme; OUTPUT: RETVAL int EXPAND_FLAG_IGNORE_REPLACES() CODE: RETVAL = EXPAND_FLAG_IGNORE_REPLACES; OUTPUT: RETVAL int EXPAND_FLAG_IGNORE_EMPTY() CODE: RETVAL = EXPAND_FLAG_IGNORE_EMPTY; OUTPUT: RETVAL int EXPAND_FLAG_RECURSIVE_MASK() CODE: RETVAL = EXPAND_FLAG_RECURSIVE_MASK; OUTPUT: RETVAL void theme_register(formats) SV *formats PREINIT: AV *av; FORMAT_REC *formatrecs; char *key, *value; int len, n, fpos; CODE: if (!SvROK(formats)) croak("formats is not a reference to list"); av = (AV *) SvRV(formats); len = av_len(av)+1; if (len == 0 || (len & 1) != 0) croak("formats list is invalid - not divisible by 2 (%d)", len); formatrecs = g_new0(FORMAT_REC, len/2+2); formatrecs[0].tag = g_strdup(perl_get_package()); formatrecs[0].def = g_strdup("Perl script"); for (fpos = 1, n = 0; n < len; n++, fpos++) { key = SvPV(*av_fetch(av, n, 0), PL_na); n++; value = SvPV(*av_fetch(av, n, 0), PL_na); formatrecs[fpos].tag = g_strdup(key); formatrecs[fpos].def = g_strdup(value); formatrecs[fpos].params = MAX_FORMAT_PARAMS; } theme_register_module(perl_get_package(), formatrecs); void printformat(level, format, ...) int level char *format PREINIT: TEXT_DEST_REC dest; char *arglist[MAX_FORMAT_PARAMS+1]; int n; CODE: format_create_dest(&dest, NULL, NULL, level, NULL); memset(arglist, 0, sizeof(arglist)); for (n = 2; n < items && n < MAX_FORMAT_PARAMS+2; n++) { arglist[n-2] = SvPV(ST(n), PL_na); } printformat_perl(&dest, format, arglist); void abstracts_register(abstracts) SV *abstracts PREINIT: AV *av; char *key, *value; int i, len; CODE: if (!SvROK(abstracts)) croak("abstracts is not a reference to list"); av = (AV *) SvRV(abstracts); len = av_len(av)+1; if (len == 0 || (len & 1) != 0) croak("abstracts list is invalid - not divisible by 2 (%d)", len); for (i = 0; i < len; i++) { key = SvPV(*av_fetch(av, i, 0), PL_na); i++; value = SvPV(*av_fetch(av, i, 0), PL_na); theme_set_default_abstract(key, value); } themes_reload(); void themes_reload() #******************************* MODULE = Irssi::UI::Themes PACKAGE = Irssi::Server #******************************* void printformat(server, target, level, format, ...) Irssi::Server server char *target int level char *format PREINIT: TEXT_DEST_REC dest; char *arglist[MAX_FORMAT_PARAMS+1]; int n; CODE: format_create_dest(&dest, server, target, level, NULL); memset(arglist, 0, sizeof(arglist)); for (n = 4; n < items && n < MAX_FORMAT_PARAMS+4; n++) { arglist[n-4] = SvPV(ST(n), PL_na); } printformat_perl(&dest, format, arglist); #******************************* MODULE = Irssi::UI::Themes PACKAGE = Irssi::UI::Window #******************************* void printformat(window, level, format, ...) Irssi::UI::Window window int level char *format PREINIT: TEXT_DEST_REC dest; char *arglist[MAX_FORMAT_PARAMS+1]; int n; CODE: format_create_dest(&dest, NULL, NULL, level, window); memset(arglist, 0, sizeof(arglist)); for (n = 3; n < items && n < MAX_FORMAT_PARAMS+3; n++) { arglist[n-3] = SvPV(ST(n), PL_na); } printformat_perl(&dest, format, arglist); #******************************* MODULE = Irssi::UI::Themes PACKAGE = Irssi::Windowitem #******************************* void printformat(item, level, format, ...) Irssi::Windowitem item int level char *format PREINIT: TEXT_DEST_REC dest; char *arglist[MAX_FORMAT_PARAMS+1]; int n; CODE: format_create_dest(&dest, item->server, item->visible_name, level, NULL); memset(arglist, 0, sizeof(arglist)); for (n = 3; n < items && n < MAX_FORMAT_PARAMS+3; n++) { arglist[n-3] = SvPV(ST(n), PL_na); } printformat_perl(&dest, format, arglist); #******************************* MODULE = Irssi::UI::Themes PACKAGE = Irssi::UI::Theme PREFIX = theme_ #******************************* void theme_format_expand(theme, format, flags=0) Irssi::UI::Theme theme char *format int flags PREINIT: char *ret; PPCODE: if (flags == 0) { ret = theme_format_expand(theme, format); } else { ret = theme_format_expand_data(theme, (const char **) &format, 'n', 'n', NULL, NULL, EXPAND_FLAG_ROOT | flags); } XPUSHs(sv_2mortal(new_pv(ret))); g_free_not_null(ret); char * theme_get_format(theme, module, tag) Irssi::UI::Theme theme char *module char *tag PREINIT: MODULE_THEME_REC *modtheme; FORMAT_REC *formats; int i; CODE: formats = g_hash_table_lookup(default_formats, module); if (formats == NULL) croak("Unknown module: %s", module); for (i = 0; formats[i].def != NULL; i++) { if (formats[i].tag != NULL && g_strcasecmp(formats[i].tag, tag) == 0) break; } if (formats[i].def == NULL) croak("Unknown format tag: %s", tag); modtheme = g_hash_table_lookup(theme->modules, module); RETVAL = modtheme == NULL ? NULL : modtheme->formats[i]; if (RETVAL == NULL) RETVAL = formats[i].def; OUTPUT: RETVAL