--- rxvt-unicode/src/rxvtperl.xs 2006/01/02 21:17:01 1.6 +++ rxvt-unicode/src/rxvtperl.xs 2006/01/03 01:29:55 1.10 @@ -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 * @@ -311,6 +316,8 @@ 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); } @@ -392,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 (!IN_RANGE_INC (start_col, 0, THIS->ncol - len)) + { + free (wstr); + croak ("new_text extends beyond horizontal margins"); + } + + 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 (!IN_RANGE_INC (start_col, 0, THIS->ncol - len)) + croak ("new_rend array extends beyond horizontal margins"); + + 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: