--- rxvt-unicode/src/rxvtperl.xs 2006/01/02 15:35:43 1.1 +++ rxvt-unicode/src/rxvtperl.xs 2006/01/02 21:17:01 1.6 @@ -210,21 +210,13 @@ bool rxvt_perl_interp::invoke (rxvt_term *term, hook_type htype, ...) { - if (!perl) + if (!perl + || (!should_invoke [htype] && htype != HOOK_INIT && htype != HOOK_DESTROY)) return false; - + if (htype == HOOK_INIT) // first hook ever called term->self = (void *)newSVptr ((void *)term, "urxvt::term"); - else if (htype == HOOK_DESTROY) - { - // TODO: clear magic - hv_clear ((HV *)SvRV ((SV *)term->self)); - SvREFCNT_dec ((SV *)term->self); - } - if (!should_invoke [htype]) - return false; - dSP; va_list ap; @@ -251,6 +243,10 @@ XPUSHs (sv_2mortal (newSViv (va_arg (ap, long)))); break; + case DT_STRING: + XPUSHs (sv_2mortal (newSVpv (va_arg (ap, char *), 0))); + break; + case DT_END: { va_end (ap); @@ -272,6 +268,13 @@ if (SvTRUE (ERRSV)) rxvt_warn ("perl hook %d evaluation error: %s", htype, SvPV_nolen (ERRSV)); + if (htype == HOOK_DESTROY) + { + // TODO: clear magic + hv_clear ((HV *)SvRV ((SV *)term->self)); + SvREFCNT_dec ((SV *)term->self); + } + return count; } @@ -291,7 +294,6 @@ { # define set_hookname(sym) av_store (hookname, PP_CONCAT(HOOK_, sym), newSVpv (PP_STRINGIFY(sym), 0)) AV *hookname = get_av ("urxvt::HOOKNAME", 1); - set_hookname (LOAD); set_hookname (INIT); set_hookname (RESET); set_hookname (START); @@ -307,6 +309,7 @@ set_hookname (TTY_ACTIVITY); set_hookname (REFRESH_BEGIN); set_hookname (REFRESH_END); + set_hookname (KEYBOARD_COMMAND); sv_setpv (get_sv ("urxvt::LIBDIR", 1), LIBDIR); } @@ -326,25 +329,108 @@ CODE: rxvt_fatal ("%s", msg); +NV +NOW () + CODE: + RETVAL = NOW; + OUTPUT: + RETVAL + +MODULE = urxvt PACKAGE = urxvt::term + int -wcswidth (SV *str) +rxvt_term::strwidth (SV *str) CODE: { wchar_t *wstr = sv2wcs (str); + + rxvt_push_locale (THIS->locale); RETVAL = wcswidth (wstr, wcslen (wstr)); + rxvt_pop_locale (); + free (wstr); } OUTPUT: RETVAL -NV -NOW () +SV * +rxvt_term::locale_encode (SV *str) CODE: - RETVAL = NOW; - OUTPUT: +{ + wchar_t *wstr = sv2wcs (str); + + rxvt_push_locale (THIS->locale); + char *mbstr = rxvt_wcstombs (wstr); + rxvt_pop_locale (); + + free (wstr); + + RETVAL = newSVpv (mbstr, 0); + free (mbstr); +} + OUTPUT: RETVAL -MODULE = urxvt PACKAGE = urxvt::term +SV * +rxvt_term::locale_decode (SV *octets) + CODE: +{ + STRLEN len; + char *data = SvPVbyte (octets, len); + + rxvt_push_locale (THIS->locale); + wchar_t *wstr = rxvt_mbstowcs (data, len); + rxvt_pop_locale (); + + char *str = rxvt_wcstoutf8 (wstr); + free (wstr); + + RETVAL = newSVpv (str, 0); + SvUTF8_on (RETVAL); + free (str); +} + OUTPUT: + RETVAL + +void +rxvt_term::_resource (char *name, int index, SV *newval = 0) + PPCODE: +{ + struct resval { const char *name; int value; } rslist [] = { +# define Rs_def(name) { # name, Rs_ ## name }, +# define Rs_reserve(name,count) +# include "rsinc.h" +# undef Rs_def +# undef Rs_reserve + }; + + struct resval *rs = rslist + sizeof (rslist) / sizeof (rslist [0]); + + do { + if (rs-- == rslist) + croak ("no such resource '%s', requested", name); + } while (strcmp (name, rs->name)); + + index += rs->value; + + if (!IN_RANGE_EXC (index, 0, NUM_RESOURCES)) + croak ("requested out-of-bound resource %s+%d,", name, index - rs->value); + + if (GIMME_V != G_VOID) + XPUSHs (THIS->rs [index] ? sv_2mortal (newSVpv (THIS->rs [index], 0)) : &PL_sv_undef); + + if (newval) + { + if (SvOK (newval)) + { + char *str = strdup (SvPVbyte_nolen (newval)); + THIS->rs [index] = str; + THIS->allocated.push_back (str); + } + else + THIS->rs [index] = 0; + } +} void rxvt_term::selection_mark (...) @@ -420,6 +506,14 @@ free (wtext); } +void +rxvt_term::tt_write (SV *octets) + INIT: + STRLEN len; + char *str = SvPVbyte (octets, len); + C_ARGS: + (unsigned char *)str, len + MODULE = urxvt PACKAGE = urxvt::timer SV *