--- rxvt-unicode/src/rxvtperl.xs 2008/08/22 15:36:45 1.125 +++ rxvt-unicode/src/rxvtperl.xs 2010/05/23 00:08:53 1.131 @@ -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]; @@ -648,6 +656,17 @@ const_iv (NUM_RESOURCES), const_iv (DEFAULT_RSTYLE), const_iv (OVERLAY_RSTYLE), + const_iv (Color_Bits), + const_iv (RS_bgShift), const_iv (RS_bgMask), + const_iv (RS_fgShift), const_iv (RS_fgMask), + const_iv (RS_Careful), + const_iv (RS_fontCount), + const_iv (RS_fontShift), + const_iv (RS_fontMask), + const_iv (RS_baseattrMask), + const_iv (RS_attrMask), + const_iv (RS_redraw), + const_iv (RS_Sel), const_iv (RS_Bold), const_iv (RS_Italic), const_iv (RS_Blink), @@ -1049,40 +1068,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: @@ -1542,7 +1563,7 @@ PUSHs (sv_2mortal (newSViv (rc.col))); } - if (items == 3) + if (items >= 3) { rc.row = SvIV (ST (1)); rc.col = SvIV (ST (2)); @@ -1568,21 +1589,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) @@ -1592,26 +1617,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)