mirror of
https://github.com/irssi/irssi.git
synced 2024-12-04 14:46:39 -05:00
Exported expando interface to perl. Fix for statusbar deinit.
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@2975 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
d3f4f13f94
commit
d58e119a98
@ -46,6 +46,8 @@ typedef struct {
|
|||||||
int signal_args[MAX_EXPANDO_SIGNALS];
|
int signal_args[MAX_EXPANDO_SIGNALS];
|
||||||
} EXPANDO_REC;
|
} EXPANDO_REC;
|
||||||
|
|
||||||
|
const char *current_expando = NULL;
|
||||||
|
|
||||||
static int timer_tag;
|
static int timer_tag;
|
||||||
|
|
||||||
static EXPANDO_REC *char_expandos[255];
|
static EXPANDO_REC *char_expandos[255];
|
||||||
|
@ -16,6 +16,8 @@ typedef enum {
|
|||||||
typedef char* (*EXPANDO_FUNC)
|
typedef char* (*EXPANDO_FUNC)
|
||||||
(SERVER_REC *server, void *item, int *free_ret);
|
(SERVER_REC *server, void *item, int *free_ret);
|
||||||
|
|
||||||
|
extern const char *current_expando;
|
||||||
|
|
||||||
/* Create expando - overrides any existing ones.
|
/* Create expando - overrides any existing ones.
|
||||||
... = signal, type, ..., NULL - list of signals that might change the
|
... = signal, type, ..., NULL - list of signals that might change the
|
||||||
value of this expando */
|
value of this expando */
|
||||||
|
@ -113,8 +113,10 @@ static char *get_long_variable_value(const char *key, SERVER_REC *server,
|
|||||||
|
|
||||||
/* expando? */
|
/* expando? */
|
||||||
func = expando_find_long(key);
|
func = expando_find_long(key);
|
||||||
if (func != NULL)
|
if (func != NULL) {
|
||||||
|
current_expando = key;
|
||||||
return func(server, item, free_ret);
|
return func(server, item, free_ret);
|
||||||
|
}
|
||||||
|
|
||||||
/* internal setting? */
|
/* internal setting? */
|
||||||
type = settings_get_type(key);
|
type = settings_get_type(key);
|
||||||
@ -176,7 +178,15 @@ static char *get_variable(char **cmd, SERVER_REC *server, void *item,
|
|||||||
}
|
}
|
||||||
*free_ret = FALSE;
|
*free_ret = FALSE;
|
||||||
func = expando_find_char(**cmd);
|
func = expando_find_char(**cmd);
|
||||||
return func == NULL ? NULL : func(server, item, free_ret);
|
if (func == NULL)
|
||||||
|
return NULL;
|
||||||
|
else {
|
||||||
|
char str[2];
|
||||||
|
|
||||||
|
str[0] = **cmd; str[1] = '\0';
|
||||||
|
current_expando = str;
|
||||||
|
return func(server, item, free_ret);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *get_history(char **cmd, void *item, int *free_ret)
|
static char *get_history(char **cmd, void *item, int *free_ret)
|
||||||
|
@ -78,6 +78,7 @@ common_sources = \
|
|||||||
common/Irssi.pm \
|
common/Irssi.pm \
|
||||||
common/Channel.xs \
|
common/Channel.xs \
|
||||||
common/Core.xs \
|
common/Core.xs \
|
||||||
|
common/Expandos.xs \
|
||||||
common/Ignore.xs \
|
common/Ignore.xs \
|
||||||
common/Log.xs \
|
common/Log.xs \
|
||||||
common/Masks.xs \
|
common/Masks.xs \
|
||||||
|
170
src/perl/common/Expando.xs
Normal file
170
src/perl/common/Expando.xs
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
#include "module.h"
|
||||||
|
#include "expandos.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
PERL_SCRIPT_REC *script;
|
||||||
|
SV *func;
|
||||||
|
} PerlExpando;
|
||||||
|
|
||||||
|
static GHashTable *perl_expando_defs;
|
||||||
|
|
||||||
|
static char *sig_perl_expando(SERVER_REC *server, void *item, int *free_ret);
|
||||||
|
|
||||||
|
static int check_expando_destroy(char *key, PerlExpando *rec,
|
||||||
|
PERL_SCRIPT_REC *script)
|
||||||
|
{
|
||||||
|
if (rec->script == script) {
|
||||||
|
expando_destroy(key, sig_perl_expando);
|
||||||
|
SvREFCNT_dec(rec->func);
|
||||||
|
g_free(key);
|
||||||
|
g_free(rec);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void script_unregister_expandos(PERL_SCRIPT_REC *script)
|
||||||
|
{
|
||||||
|
g_hash_table_foreach_remove(perl_expando_defs,
|
||||||
|
(GHRFunc) check_expando_destroy, script);
|
||||||
|
}
|
||||||
|
|
||||||
|
void perl_expando_init(void)
|
||||||
|
{
|
||||||
|
perl_expando_defs = g_hash_table_new((GHashFunc) g_str_hash,
|
||||||
|
(GCompareFunc) g_str_equal);
|
||||||
|
signal_add("script destroyed", (SIGNAL_FUNC) script_unregister_expandos);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void expando_def_destroy(char *key, PerlExpando *rec)
|
||||||
|
{
|
||||||
|
SvREFCNT_dec(rec->func);
|
||||||
|
g_free(key);
|
||||||
|
g_free(rec);
|
||||||
|
}
|
||||||
|
|
||||||
|
void perl_expando_deinit(void)
|
||||||
|
{
|
||||||
|
signal_remove("script destroyed", (SIGNAL_FUNC) script_unregister_expandos);
|
||||||
|
|
||||||
|
g_hash_table_foreach(perl_expando_defs,
|
||||||
|
(GHFunc) expando_def_destroy, NULL);
|
||||||
|
g_hash_table_destroy(perl_expando_defs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *perl_expando_event(PerlExpando *rec, SERVER_REC *server,
|
||||||
|
WI_ITEM_REC *item, int *free_ret)
|
||||||
|
{
|
||||||
|
dSP;
|
||||||
|
char *ret;
|
||||||
|
int retcount;
|
||||||
|
|
||||||
|
ENTER;
|
||||||
|
SAVETMPS;
|
||||||
|
|
||||||
|
PUSHMARK(SP);
|
||||||
|
XPUSHs(sv_2mortal(iobject_bless(server)));
|
||||||
|
XPUSHs(sv_2mortal(iobject_bless(item)));
|
||||||
|
PUTBACK;
|
||||||
|
|
||||||
|
retcount = perl_call_sv(rec->func, G_EVAL|G_SCALAR);
|
||||||
|
SPAGAIN;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
PUTBACK;
|
||||||
|
FREETMPS;
|
||||||
|
LEAVE;
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *sig_perl_expando(SERVER_REC *server, void *item, int *free_ret)
|
||||||
|
{
|
||||||
|
PerlExpando *rec;
|
||||||
|
|
||||||
|
rec = g_hash_table_lookup(perl_expando_defs, current_expando);
|
||||||
|
if (rec != NULL)
|
||||||
|
return perl_expando_event(rec, server, item, free_ret);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void expando_signals_add_hash(const char *key, SV *signals)
|
||||||
|
{
|
||||||
|
HV *hv;
|
||||||
|
HE *he;
|
||||||
|
I32 len;
|
||||||
|
const char *argstr;
|
||||||
|
ExpandoArg arg;
|
||||||
|
|
||||||
|
if (!is_hvref(signals)) {
|
||||||
|
croak("Usage: Irssi::expando_create(key, func, hash)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
hv = hvref(signals);
|
||||||
|
hv_iterinit(hv);
|
||||||
|
while ((he = hv_iternext(hv)) != NULL) {
|
||||||
|
SV *argsv = HeVAL(he);
|
||||||
|
argstr = SvPV(argsv, PL_na);
|
||||||
|
|
||||||
|
if (strcasecmp(argstr, "none") == 0)
|
||||||
|
arg = EXPANDO_ARG_NONE;
|
||||||
|
else if (strcasecmp(argstr, "server") == 0)
|
||||||
|
arg = EXPANDO_ARG_SERVER;
|
||||||
|
else if (strcasecmp(argstr, "window") == 0)
|
||||||
|
arg = EXPANDO_ARG_WINDOW;
|
||||||
|
else if (strcasecmp(argstr, "windowitem") == 0)
|
||||||
|
arg = EXPANDO_ARG_WINDOW_ITEM;
|
||||||
|
else if (strcasecmp(argstr, "never") == 0)
|
||||||
|
arg = EXPANDO_NEVER;
|
||||||
|
else {
|
||||||
|
croak("Unknown signal type: %s", argstr);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
expando_add_signal(key, hv_iterkey(he, &len), arg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MODULE = Irssi::Expando PACKAGE = Irssi
|
||||||
|
PROTOTYPES: ENABLE
|
||||||
|
|
||||||
|
void
|
||||||
|
expando_create(key, func, signals)
|
||||||
|
char *key
|
||||||
|
SV *func
|
||||||
|
SV *signals
|
||||||
|
PREINIT:
|
||||||
|
PerlExpando *rec;
|
||||||
|
CODE:
|
||||||
|
rec = g_new0(PerlExpando, 1);
|
||||||
|
rec->script = perl_script_find_package(perl_get_package());
|
||||||
|
rec->func = perl_func_sv_inc(func, perl_get_package());
|
||||||
|
|
||||||
|
expando_create(key, sig_perl_expando, NULL);
|
||||||
|
g_hash_table_insert(perl_expando_defs, g_strdup(key), rec);
|
||||||
|
expando_signals_add_hash(key, signals);
|
||||||
|
|
||||||
|
void
|
||||||
|
expando_destroy(name)
|
||||||
|
char *name
|
||||||
|
PREINIT:
|
||||||
|
gpointer key, value;
|
||||||
|
CODE:
|
||||||
|
if (g_hash_table_lookup_extended(perl_expando_defs, name, &key, &value)) {
|
||||||
|
g_hash_table_remove(perl_expando_defs, name);
|
||||||
|
g_free(key);
|
||||||
|
SvREFCNT_dec((SV *) value);
|
||||||
|
}
|
||||||
|
expando_destroy(name, sig_perl_expando);
|
@ -14,16 +14,19 @@ CODE:
|
|||||||
initialized = TRUE;
|
initialized = TRUE;
|
||||||
|
|
||||||
perl_settings_init();
|
perl_settings_init();
|
||||||
|
perl_expando_init();
|
||||||
|
|
||||||
void
|
void
|
||||||
deinit()
|
deinit()
|
||||||
CODE:
|
CODE:
|
||||||
if (!initialized) return;
|
if (!initialized) return;
|
||||||
|
perl_expando_deinit();
|
||||||
perl_settings_deinit();
|
perl_settings_deinit();
|
||||||
|
|
||||||
BOOT:
|
BOOT:
|
||||||
irssi_boot(Channel);
|
irssi_boot(Channel);
|
||||||
irssi_boot(Core);
|
irssi_boot(Core);
|
||||||
|
irssi_boot(Expando);
|
||||||
irssi_boot(Ignore);
|
irssi_boot(Ignore);
|
||||||
irssi_boot(Log);
|
irssi_boot(Log);
|
||||||
irssi_boot(Masks);
|
irssi_boot(Masks);
|
||||||
|
@ -31,7 +31,7 @@ PPCODE:
|
|||||||
}
|
}
|
||||||
|
|
||||||
Irssi::Connect
|
Irssi::Connect
|
||||||
server_create_conn(chat_type, dest, port=6667, chatnet=NULL, password=NULL, nick=NULL)
|
server_create_conn(chat_type, dest, port, chatnet=NULL, password=NULL, nick=NULL)
|
||||||
int chat_type
|
int chat_type
|
||||||
char *dest
|
char *dest
|
||||||
int port
|
int port
|
||||||
|
@ -31,6 +31,7 @@ void perl_statusbar_init(void)
|
|||||||
|
|
||||||
static void statusbar_item_def_destroy(void *key, void *value)
|
static void statusbar_item_def_destroy(void *key, void *value)
|
||||||
{
|
{
|
||||||
|
statusbar_item_unregister(key);
|
||||||
g_free(key);
|
g_free(key);
|
||||||
g_free(value);
|
g_free(value);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user