--- rxvt-unicode/src/rxvtperl.xs 2006/01/02 18:20:23 1.3 +++ rxvt-unicode/src/rxvtperl.xs 2006/01/03 01:15:00 1.9 @@ -37,6 +37,11 @@ #include "perlxsi.c" +#undef LINENO +#define LINENO(n) MOD (THIS->term_start + int(n), THIS->total_rows) +#undef ROW +#define ROW(n) THIS->row_buf [LINENO (n)] + ///////////////////////////////////////////////////////////////////////////// static wchar_t * @@ -210,21 +215,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 +248,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 +273,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 +299,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 +314,9 @@ set_hookname (TTY_ACTIVITY); set_hookname (REFRESH_BEGIN); set_hookname (REFRESH_END); + set_hookname (KEYBOARD_COMMAND); + + newCONSTSUB (gv_stashpv ("urxvt", 1), "DEFAULT_RSTYLE", newSViv (DEFAULT_RSTYLE)); sv_setpv (get_sv ("urxvt::LIBDIR", 1), LIBDIR); } @@ -389,6 +399,162 @@ OUTPUT: RETVAL +int +rxvt_term::nsaved () + CODE: + RETVAL = THIS->nsaved; + OUTPUT: + RETVAL + +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 + +int +rxvt_term::nrow () + CODE: + RETVAL = THIS->nrow; + OUTPUT: + RETVAL + +int +rxvt_term::ncol () + CODE: + RETVAL = THIS->ncol; + OUTPUT: + RETVAL + +void +rxvt_term::want_refresh () + CODE: + THIS->want_refresh = 1; + +void +rxvt_term::ROW_t (int row_number, SV *new_text = 0, int start_col = 0) + PPCODE: +{ + if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) + croak ("row_number number of out range"); + + line_t &l = ROW(row_number); + + if (GIMME_V != G_VOID) + { + wchar_t *wstr = new wchar_t [THIS->ncol]; + + for (int col = 0; col ncol; col++) + wstr [col] = l.t [col]; + + char *str = rxvt_wcstoutf8 (wstr, THIS->ncol); + free (wstr); + + SV *sv = newSVpv (str, 0); + SvUTF8_on (sv); + XPUSHs (sv_2mortal (sv)); + free (str); + } + + if (new_text) + { + STRLEN slen; + char *str = SvPVutf8 (new_text, slen); + wchar_t *wstr = rxvt_utf8towcs (str, slen); + + int len = wcslen (wstr); + + if (start_col + len > THIS->ncol) + { + free (wstr); + croak ("new_text extends beyond right margin"); + } + + for (int col = start_col; col < start_col + len; col++) + { + l.t [col] = wstr [col - start_col]; + l.r [col] = SET_FONT (l.r [col], THIS->fontset [GET_STYLE (l.r [col])]->find_font (l.t [col])); + } + + free (wstr); + } +} + +void +rxvt_term::ROW_r (int row_number, SV *new_rend = 0, int start_col = 0) + PPCODE: +{ + if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) + croak ("row_number number of out range"); + + line_t &l = ROW(row_number); + + if (GIMME_V != G_VOID) + { + AV *av = newAV (); + + av_extend (av, THIS->ncol - 1); + for (int col = 0; col < THIS->ncol; col++) + av_store (av, col, newSViv (l.r [col])); + + XPUSHs (sv_2mortal (newRV_noinc ((SV *)av))); + } + + if (new_rend) + { + if (!SvROK (new_rend) || SvTYPE (SvRV (new_rend)) != SVt_PVAV) + croak ("new_rend must be arrayref"); + + AV *av = (AV *)SvRV (new_rend); + int len = av_len (av) + 1; + + if (start_col + len > THIS->ncol) + croak ("new_rend array extends beyond right margin"); + + for (int col = start_col; col < start_col + len; col++) + { + rend_t r = SvIV (*av_fetch (av, col - start_col, 1)) & ~RS_fontMask; + + l.r [col] = SET_FONT (r, THIS->fontset [GET_STYLE (r)]->find_font (l.t [col])); + } + } +} + +int +rxvt_term::ROW_l (int row_number, int new_length = -2) + CODE: +{ + if (!IN_RANGE_EXC (row_number, -THIS->nsaved, THIS->nrow)) + croak ("row_number number of out range"); + + line_t &l = ROW(row_number); + RETVAL = l.l; + + if (new_length >= -1) + l.l = new_length; +} + OUTPUT: + RETVAL + +SV * +rxvt_term::special_encode (SV *str) + CODE: + abort ();//TODO + +SV * +rxvt_term::special_decode (SV *str) + CODE: + abort ();//TODO + void rxvt_term::_resource (char *name, int index, SV *newval = 0) PPCODE: