--- rxvt-unicode/src/rxvtperl.xs 2006/01/02 17:17:02 1.2 +++ rxvt-unicode/src/rxvtperl.xs 2006/01/02 22:23:26 1.7 @@ -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,90 @@ 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; +{ + 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 + +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 + +int +rxvt_term::nsaved () + CODE: + RETVAL = THIS->nsaved; OUTPUT: RETVAL -MODULE = urxvt PACKAGE = urxvt::term +int +rxvt_term::view_start (int newval = -1) + CODE: +{ + RETVAL = THIS->view_start; + + if (newval >= 0) + { + THIS->view_start = min (newval, THIS->nsaved); + THIS->scr_changeview (RETVAL); + } +} + OUTPUT: + RETVAL void rxvt_term::_resource (char *name, int index, SV *newval = 0) @@ -460,6 +528,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 *