--- rxvt-unicode/src/rxvtperl.xs 2006/01/02 20:35:39 1.5 +++ rxvt-unicode/src/rxvtperl.xs 2006/01/03 02:42:17 1.12 @@ -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 * @@ -243,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); @@ -289,6 +298,7 @@ BOOT: { # define set_hookname(sym) av_store (hookname, PP_CONCAT(HOOK_, sym), newSVpv (PP_STRINGIFY(sym), 0)) +# define export_const(name) newCONSTSUB (gv_stashpv ("urxvt", 1), #name, newSViv (name)); AV *hookname = get_av ("urxvt::HOOKNAME", 1); set_hookname (INIT); set_hookname (RESET); @@ -305,6 +315,15 @@ set_hookname (TTY_ACTIVITY); set_hookname (REFRESH_BEGIN); set_hookname (REFRESH_END); + set_hookname (KEYBOARD_COMMAND); + + export_const (DEFAULT_RSTYLE); + export_const (OVERLAY_RSTYLE); + export_const (RS_Bold); + export_const (RS_Italic); + export_const (RS_Blink); + export_const (RS_RVid); + export_const (RS_Uline); sv_setpv (get_sv ("urxvt::LIBDIR", 1), LIBDIR); } @@ -331,6 +350,54 @@ OUTPUT: RETVAL +int +GET_BASEFG (int rend) + CODE: + RETVAL = GET_BASEFG (rend); + OUTPUT: + RETVAL + +int +GET_BASEBG (int rend) + CODE: + RETVAL = GET_BASEBG (rend); + OUTPUT: + RETVAL + +int +SET_FGCOLOR (int rend, int new_color) + CODE: + RETVAL = SET_FGCOLOR (rend, new_color); + OUTPUT: + RETVAL + +int +SET_BGCOLOR (int rend, int new_color) + CODE: + RETVAL = SET_BGCOLOR (rend, new_color); + OUTPUT: + RETVAL + +int +GET_CUSTOM (int rend) + CODE: + RETVAL = (rend && RS_customMask) >> RS_customShift; + OUTPUT: + RETVAL + +int +SET_CUSTOM (int rend, int new_value) + CODE: +{ + if (!IN_RANGE_EXC (new_value, 0, RS_customCount)) + croak ("custom value out of range, must be 0..%d", RS_customCount - 1); + + RETVAL = (rend & ~RS_customMask) + | ((new_value << RS_customShift) & RS_customMask); +} + OUTPUT: + RETVAL + MODULE = urxvt PACKAGE = urxvt::term int @@ -387,6 +454,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: