--- rxvt-unicode/src/rxvtperl.xs 2008/06/15 14:54:44 1.123 +++ rxvt-unicode/src/rxvtperl.xs 2010/02/14 19:34:42 1.130 @@ -109,13 +109,11 @@ #define SvOVERLAY(sv) (overlay *)SvPTR (sv, "urxvt::overlay") -class overlay { +class overlay : overlay_base +{ rxvt_term *THIS; AV *overlay_av; - int x, y, w, h; int border; - text_t **text; - rend_t **rend; public: HV *self; @@ -132,8 +130,13 @@ }; overlay::overlay (rxvt_term *THIS, int x_, int y_, int w_, int h_, rend_t rstyle, int border) -: THIS(THIS), x(x_), y(y_), w(w_), h(h_), border(border == 2), overlay_av (0) +: THIS(THIS), border(border == 2), overlay_av (0) { + x = x_; + y = y_; + w = w_; + h = h_; + if (w < 0) w = 0; if (h < 0) h = 0; @@ -247,6 +250,11 @@ int ov_w = min (w, THIS->ncol - ov_x); int ov_h = min (h, THIS->nrow - ov_y); + // hide cursor if it is within the overlay area + if (IN_RANGE_EXC (THIS->screen.cur.col - ov_x, 0, ov_w) + && IN_RANGE_EXC (THIS->screen.cur.row - ov_y, 0, ov_h)) + THIS->screen.flags &= ~Screen_VisibleCursor; + for (int y = ov_h; y--; ) { text_t *t1 = text [y]; @@ -312,6 +320,7 @@ { perl_destruct (perl); perl_free (perl); + PERL_SYS_TERM (); } } @@ -325,7 +334,7 @@ perl_environ = rxvt_environ; swap (perl_environ, environ); - char *argv[] = { + char *args[] = { "", "-e" "BEGIN {" @@ -335,11 +344,14 @@ "" "use urxvt;" }; + int argc = sizeof (args) / sizeof (args[0]); + char **argv = args; + PERL_SYS_INIT3 (&argc, &argv, &environ); perl = perl_alloc (); perl_construct (perl); - if (perl_parse (perl, xs_init, 2, argv, (char **)NULL) + if (perl_parse (perl, xs_init, argc, argv, (char **)NULL) || perl_run (perl)) { rxvt_warn ("unable to initialize perl-interpreter, continuing without.\n"); @@ -1045,40 +1057,42 @@ #define TERM_OFFSET(sym) offsetof (TermWin_t, sym) -#define TERM_OFFSET_width TERM_OFFSET(width) -#define TERM_OFFSET_height TERM_OFFSET(height) -#define TERM_OFFSET_fwidth TERM_OFFSET(fwidth) -#define TERM_OFFSET_fheight TERM_OFFSET(fheight) -#define TERM_OFFSET_fbase TERM_OFFSET(fbase) -#define TERM_OFFSET_nrow TERM_OFFSET(nrow) -#define TERM_OFFSET_ncol TERM_OFFSET(ncol) -#define TERM_OFFSET_focus TERM_OFFSET(focus) -#define TERM_OFFSET_mapped TERM_OFFSET(mapped) -#define TERM_OFFSET_int_bwidth TERM_OFFSET(int_bwidth) -#define TERM_OFFSET_ext_bwidth TERM_OFFSET(ext_bwidth) -#define TERM_OFFSET_lineSpace TERM_OFFSET(lineSpace) -#define TERM_OFFSET_saveLines TERM_OFFSET(saveLines) -#define TERM_OFFSET_total_rows TERM_OFFSET(total_rows) -#define TERM_OFFSET_top_row TERM_OFFSET(top_row) +#define TERM_OFFSET_width TERM_OFFSET(width) +#define TERM_OFFSET_height TERM_OFFSET(height) +#define TERM_OFFSET_fwidth TERM_OFFSET(fwidth) +#define TERM_OFFSET_fheight TERM_OFFSET(fheight) +#define TERM_OFFSET_fbase TERM_OFFSET(fbase) +#define TERM_OFFSET_nrow TERM_OFFSET(nrow) +#define TERM_OFFSET_ncol TERM_OFFSET(ncol) +#define TERM_OFFSET_focus TERM_OFFSET(focus) +#define TERM_OFFSET_mapped TERM_OFFSET(mapped) +#define TERM_OFFSET_int_bwidth TERM_OFFSET(int_bwidth) +#define TERM_OFFSET_ext_bwidth TERM_OFFSET(ext_bwidth) +#define TERM_OFFSET_lineSpace TERM_OFFSET(lineSpace) +#define TERM_OFFSET_letterSpace TERM_OFFSET(letterSpace) +#define TERM_OFFSET_saveLines TERM_OFFSET(saveLines) +#define TERM_OFFSET_total_rows TERM_OFFSET(total_rows) +#define TERM_OFFSET_top_row TERM_OFFSET(top_row) int rxvt_term::width () ALIAS: - width = TERM_OFFSET_width - height = TERM_OFFSET_height - fwidth = TERM_OFFSET_fwidth - fheight = TERM_OFFSET_fheight - fbase = TERM_OFFSET_fbase - nrow = TERM_OFFSET_nrow - ncol = TERM_OFFSET_ncol - focus = TERM_OFFSET_focus - mapped = TERM_OFFSET_mapped - int_bwidth = TERM_OFFSET_int_bwidth - ext_bwidth = TERM_OFFSET_ext_bwidth - lineSpace = TERM_OFFSET_lineSpace - saveLines = TERM_OFFSET_saveLines - total_rows = TERM_OFFSET_total_rows - top_row = TERM_OFFSET_top_row + width = TERM_OFFSET_width + height = TERM_OFFSET_height + fwidth = TERM_OFFSET_fwidth + fheight = TERM_OFFSET_fheight + fbase = TERM_OFFSET_fbase + nrow = TERM_OFFSET_nrow + ncol = TERM_OFFSET_ncol + focus = TERM_OFFSET_focus + mapped = TERM_OFFSET_mapped + int_bwidth = TERM_OFFSET_int_bwidth + ext_bwidth = TERM_OFFSET_ext_bwidth + lineSpace = TERM_OFFSET_lineSpace + letterSpace = TERM_OFFSET_letterSpace + saveLines = TERM_OFFSET_saveLines + total_rows = TERM_OFFSET_total_rows + top_row = TERM_OFFSET_top_row CODE: RETVAL = *(int *)((char *)THIS + ix); OUTPUT: @@ -1099,7 +1113,9 @@ case 1: RETVAL = THIS->ModMetaMask; break; case 2: RETVAL = THIS->ModNumLockMask; break; case 3: RETVAL = THIS->current_screen; break; +#ifdef CURSOR_BLINK case 4: RETVAL = THIS->hidden_cursor; break; +#endif } OUTPUT: RETVAL @@ -1536,7 +1552,7 @@ PUSHs (sv_2mortal (newSViv (rc.col))); } - if (items == 3) + if (items >= 3) { rc.row = SvIV (ST (1)); rc.col = SvIV (ST (2)); @@ -1562,21 +1578,25 @@ if (ix) { + THIS->selection.screen = THIS->current_screen; + THIS->want_refresh = 1; THIS->refresh_check (); } } } -char -rxvt_term::cur_charset () +int +rxvt_term::selection_screen (int screen = -1) CODE: - RETVAL = THIS->charsets [THIS->screen.charset]; - OUTPUT: + RETVAL = THIS->selection.screen; + if (screen >= 0) + THIS->selection.screen = screen; + OUTPUT: RETVAL void -rxvt_term::selection_clear () +rxvt_term::selection_clear (bool clipboard = false) void rxvt_term::selection_make (Time eventtime, bool rect = false) @@ -1586,26 +1606,36 @@ THIS->selection_make (eventtime); int -rxvt_term::selection_grab (Time eventtime) +rxvt_term::selection_grab (Time eventtime, bool clipboard = false) void -rxvt_term::selection (SV *newtext = 0) +rxvt_term::selection (SV *newtext = 0, bool clipboard = false) PPCODE: { + wchar_t * &text = clipboard ? THIS->selection.clip_text : THIS->selection.text; + unsigned int &len = clipboard ? THIS->selection.clip_len : THIS->selection.len; + if (GIMME_V != G_VOID) - XPUSHs (THIS->selection.text - ? sv_2mortal (wcs2sv (THIS->selection.text, THIS->selection.len)) + XPUSHs (text + ? sv_2mortal (wcs2sv (text, len)) : &PL_sv_undef); if (newtext) { - free (THIS->selection.text); + free (text); - THIS->selection.text = sv2wcs (newtext); - THIS->selection.len = wcslen (THIS->selection.text); + text = sv2wcs (newtext); + len = wcslen (text); } } +char +rxvt_term::cur_charset () + CODE: + RETVAL = THIS->charsets [THIS->screen.charset]; + OUTPUT: + RETVAL + void rxvt_term::scr_xor_rect (int beg_row, int beg_col, int end_row, int end_col, U32 rstyle1 = RS_RVid, U32 rstyle2 = RS_RVid | RS_Uline)