2 #include "irssi-version.h"
8 #define DEFAULT_COMMAND_CATEGORY "Perl scripts' commands"
10 static void perl_signal_add_hash(int priority, SV *sv)
17 croak("Usage: Irssi::signal_add(hash)");
21 while ((he = hv_iternext(hv)) != NULL)
22 perl_signal_add_full(hv_iterkey(he, &len), HeVAL(he), priority);
25 static void perl_command_bind_add_hash(int priority, SV *sv, char *category)
33 while ((he = hv_iternext(hv)) != NULL)
34 perl_command_bind_to(hv_iterkey(he, &len), category, HeVAL(he), priority);
37 static void handle_command_bind(int priority, int items, SV *p0, SV *p1, SV *p2)
42 hash = items > 0 && is_hvref(p0);
44 if (items < 2 || items > 3)
45 croak("Usage: Irssi::command_bind(signal, func, category)");
47 croak("Usage: Irssi::command_bind(signals_hash, category)");
50 category = items < 3 ? DEFAULT_COMMAND_CATEGORY :
51 (char *)SvPV(p2, PL_na);
52 perl_command_bind_to((char *)SvPV(p0, PL_na), category, p1, priority);
54 category = items < 2 ? DEFAULT_COMMAND_CATEGORY :
55 (char *)SvPV(p1, PL_na);
56 perl_command_bind_add_hash(priority, p0, category);
60 static void add_tuple(gpointer key_, gpointer value_, gpointer user_data)
65 hv_store(hash, key, strlen(key), new_pv(value), 0);
68 static void wrap_signal_emit(void *signal, void **p) {
69 signal_emit(signal, 6, p[0], p[1], p[2], p[3], p[4], p[5]);
72 static void wrap_signal_continue(void *dummy, void **p) {
74 signal_continue(6, p[0], p[1], p[2], p[3], p[4], p[5]);
77 MODULE = Irssi::Core PACKAGE = Irssi
81 signal_emit(signal, ...)
85 SV *args[SIGNAL_MAX_ARGUMENTS];
88 signal_id = signal_get_uniq_id(signal);
90 if (used > SIGNAL_MAX_ARGUMENTS) {
91 used = SIGNAL_MAX_ARGUMENTS;
93 for (n = 0; n < used; ++n) {
96 perl_signal_args_to_c(wrap_signal_emit, signal, signal_id, args, used);
101 SV *args[SIGNAL_MAX_ARGUMENTS];
105 if (used > SIGNAL_MAX_ARGUMENTS) {
106 used = SIGNAL_MAX_ARGUMENTS;
108 for (n = 0; n < used; ++n) {
111 perl_signal_args_to_c(wrap_signal_continue, NULL, signal_get_emitted_id(), args, used);
116 if (items != 1 && items != 2)
117 croak("Usage: Irssi::signal_add(signal, func)");
119 perl_signal_add_full((char *)SvPV(ST(0),PL_na), ST(1),
120 SIGNAL_PRIORITY_DEFAULT);
122 perl_signal_add_hash(SIGNAL_PRIORITY_DEFAULT, ST(0));
125 signal_add_first(...)
127 if (items != 1 && items != 2)
128 croak("Usage: Irssi::signal_add_first(signal, func)");
130 perl_signal_add_full((char *)SvPV(ST(0),PL_na), ST(1),
131 SIGNAL_PRIORITY_HIGH);
133 perl_signal_add_hash(SIGNAL_PRIORITY_HIGH, ST(0));
138 if (items != 1 && items != 2)
139 croak("Usage: Irssi::signal_add_last(signal, func)");
141 perl_signal_add_full((char *)SvPV(ST(0),PL_na), ST(1),
142 SIGNAL_PRIORITY_LOW);
144 perl_signal_add_hash(SIGNAL_PRIORITY_LOW, ST(0));
147 signal_add_priority(...)
149 if (items != 2 && items != 3)
150 croak("Usage: Irssi::signal_add_priority(signal, func, priority)");
152 perl_signal_add_full((char *)SvPV(ST(0),PL_na), ST(1), SvIV(ST(2)));
154 perl_signal_add_hash(SvIV(ST(0)), ST(1));
164 if (items != 1 || !is_hvref(ST(0)))
165 croak("Usage: Irssi::signal_register(hash)");
169 while ((he = hv_iternext(hv)) != NULL) {
170 const char *key = hv_iterkey(he, &len);
174 if (!SvROK(val) || SvTYPE(SvRV(val)) != SVt_PVAV)
175 croak("not array reference");
177 av = (AV *) SvRV(val);
179 if (len > 6) len = 6;
180 for (pos = 0; pos < len; pos++) {
181 SV **val = av_fetch(av, pos, 0);
182 arr[pos] = SvPV(*val, PL_na);
185 perl_signal_register(key, arr);
190 SIGNAL_PRIORITY_LOW()
192 RETVAL = SIGNAL_PRIORITY_LOW;
197 SIGNAL_PRIORITY_DEFAULT()
199 RETVAL = SIGNAL_PRIORITY_DEFAULT;
204 SIGNAL_PRIORITY_HIGH()
206 RETVAL = SIGNAL_PRIORITY_HIGH;
211 signal_remove(signal, func)
215 perl_signal_remove(signal, func);
221 signal_stop_by_name(signal)
227 RETVAL = (char *) signal_get_emitted();
232 signal_get_emitted_id()
235 timeout_add(msecs, func, data)
241 croak("Irssi::timeout() : msecs must be >= 10");
244 RETVAL = perl_timeout_add(msecs, func, data, FALSE);
250 timeout_add_once(msecs, func, data)
256 croak("Irssi::timeout_once() : msecs must be >= 10");
259 RETVAL = perl_timeout_add(msecs, func, data, TRUE);
268 perl_source_remove(tag);
274 RETVAL = G_INPUT_READ;
281 RETVAL = G_INPUT_WRITE;
286 input_add(source, condition, func, data)
292 RETVAL = perl_input_add(source, condition, func, data, FALSE);
300 perl_source_remove(tag);
302 # maybe there's some easier way than this..? :)
306 RETVAL = MSGLEVEL_CRAP;
313 RETVAL = MSGLEVEL_MSGS;
320 RETVAL = MSGLEVEL_PUBLIC;
327 RETVAL = MSGLEVEL_NOTICES;
334 RETVAL = MSGLEVEL_SNOTES;
341 RETVAL = MSGLEVEL_CTCPS;
348 RETVAL = MSGLEVEL_ACTIONS;
355 RETVAL = MSGLEVEL_JOINS;
362 RETVAL = MSGLEVEL_PARTS;
369 RETVAL = MSGLEVEL_QUITS;
376 RETVAL = MSGLEVEL_KICKS;
383 RETVAL = MSGLEVEL_MODES;
390 RETVAL = MSGLEVEL_TOPICS;
397 RETVAL = MSGLEVEL_WALLOPS;
404 RETVAL = MSGLEVEL_INVITES;
411 RETVAL = MSGLEVEL_NICKS;
418 RETVAL = MSGLEVEL_DCC;
425 RETVAL = MSGLEVEL_DCCMSGS;
430 MSGLEVEL_CLIENTNOTICE()
432 RETVAL = MSGLEVEL_CLIENTNOTICE;
437 MSGLEVEL_CLIENTCRAP()
439 RETVAL = MSGLEVEL_CLIENTCRAP;
444 MSGLEVEL_CLIENTERROR()
446 RETVAL = MSGLEVEL_CLIENTERROR;
453 RETVAL = MSGLEVEL_HILIGHT;
460 RETVAL = MSGLEVEL_ALL;
467 RETVAL = MSGLEVEL_NOHILIGHT;
474 RETVAL = MSGLEVEL_NO_ACT;
481 RETVAL = MSGLEVEL_NEVER;
488 RETVAL = MSGLEVEL_LASTLOG;
496 RETVAL = level2bits(str, NULL);
506 ret = bits2level(bits);
507 XPUSHs(sv_2mortal(new_pv(ret)));
511 combine_level(level, str)
519 perl_command(cmd, NULL, NULL);
526 for (tmp = commands; tmp != NULL; tmp = tmp->next) {
527 XPUSHs(sv_2mortal(plain_bless(tmp->data, "Irssi::Command")));
531 command_bind_first(...)
533 handle_command_bind(SIGNAL_PRIORITY_HIGH, items, ST(0), ST(1), ST(2));
538 handle_command_bind(SIGNAL_PRIORITY_DEFAULT, items, ST(0), ST(1), ST(2));
541 command_bind_last(...)
543 handle_command_bind(SIGNAL_PRIORITY_LOW, items, ST(0), ST(1), ST(2));
546 command_runsub(cmd, data, server, item)
550 Irssi::Windowitem item
552 perl_command_runsub(cmd, data, server, item);
555 command_unbind(cmd, func)
559 perl_command_unbind(cmd, func);
562 command_set_options(cmd, options)
567 command_parse_options(cmd, data)
576 if (cmd_get_params(data, &free_arg, 1 | PARAM_FLAG_OPTIONS | PARAM_FLAG_GETREST,
577 cmd, &optlist, &ptr)) {
579 g_hash_table_foreach(optlist, add_tuple, hash);
580 XPUSHs(sv_2mortal(newRV_noinc((SV*)hash)));
581 XPUSHs(sv_2mortal(new_pv(ptr)));
582 cmd_params_free(free_arg);
584 XPUSHs(&PL_sv_undef);
585 XPUSHs(&PL_sv_undef);
597 parse_special(cmd, data="", flags=0)
604 ret = parse_special_string(cmd, NULL, NULL, data, NULL, flags);
605 XPUSHs(sv_2mortal(new_pv(ret)));
606 g_free_not_null(ret);
611 RETVAL = (char *) get_irssi_dir();
618 RETVAL = (char *) get_irssi_config();
625 RETVAL = irssi_binary;
634 g_snprintf(version, sizeof(version), "%d.%04d",
635 IRSSI_VERSION_DATE, IRSSI_VERSION_TIME);
650 RETVAL = IRSSI_GUI_NONE;
657 RETVAL = IRSSI_GUI_TEXT;
664 RETVAL = IRSSI_GUI_GTK;
671 RETVAL = IRSSI_GUI_GNOME;
678 RETVAL = IRSSI_GUI_QT;
685 RETVAL = IRSSI_GUI_KDE;
689 #*******************************
690 MODULE = Irssi::Core PACKAGE = Irssi::Server
691 #*******************************
694 parse_special(server, cmd, data="", flags=0)
702 ret = parse_special_string(cmd, server, NULL, data, NULL, flags);
703 XPUSHs(sv_2mortal(new_pv(ret)));
704 g_free_not_null(ret);
711 perl_command(cmd, server, NULL);
714 #*******************************
715 MODULE = Irssi::Core PACKAGE = Irssi::Windowitem
716 #*******************************
719 parse_special(item, cmd, data="", flags=0)
720 Irssi::Windowitem item
727 ret = parse_special_string(cmd, item->server, item, data, NULL, flags);
728 XPUSHs(sv_2mortal(new_pv(ret)));
729 g_free_not_null(ret);
733 Irssi::Windowitem item
736 perl_command(cmd, item->server, item);