--- rxvt-unicode/src/rxvtperl.xs 2008/06/15 14:07:58 1.122 +++ rxvt-unicode/src/rxvtperl.xs 2009/05/30 08:51:23 1.127 @@ -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"); @@ -641,6 +653,7 @@ IV iv; } *civ, const_iv[] = { # define const_iv(name) { # name, (IV)name } + const_iv (NUM_RESOURCES), const_iv (DEFAULT_RSTYLE), const_iv (OVERLAY_RSTYLE), const_iv (RS_Bold), @@ -1044,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: @@ -1098,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 @@ -1432,12 +1449,20 @@ rs = rslist + sizeof (rslist) / sizeof (rslist [0]); - do { - if (rs-- == rslist) - croak ("no such resource '%s', requested", name); - } while (strcmp (name, rs->name)); + if (*name) + { + do { + if (rs-- == rslist) + croak ("no such resource '%s', requested", name); + } while (strcmp (name, rs->name)); - index += rs->value; + index += rs->value; + } + else + { + --rs; + name = ""; + } if (!IN_RANGE_EXC (index, 0, NUM_RESOURCES)) croak ("requested out-of-bound resource %s+%d,", name, index - rs->value);