--- rxvt-unicode/src/rxvtperl.xs 2006/01/02 17:17:02 1.2 +++ rxvt-unicode/src/rxvtperl.xs 2006/01/02 20:35:39 1.5 @@ -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; @@ -272,6 +264,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 +290,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); @@ -326,25 +324,68 @@ 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) @@ -460,6 +501,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 *