--- rxvt-unicode/src/screen.C 2006/02/02 18:04:46 1.258 +++ rxvt-unicode/src/screen.C 2006/07/06 18:56:10 1.264 @@ -1,4 +1,4 @@ -/*--------------------------------*-C-*--------------------------------------* +/*---------------------------------------------------------------------------* * File: screen.C *---------------------------------------------------------------------------* * @@ -647,7 +647,7 @@ // optimize if already cleared, can be significant on slow machines // could be rolled into scr_blank_screen_mem - if (l.r && l.l < ncol - 1 && !((l.r[l.l + 1] ^ rstyle) & RS_bgMask)) + if (l.r && l.l < ncol - 1 && !((l.r[l.l + 1] ^ rstyle) & (RS_fgMask | RS_bgMask))) { scr_blank_line (l, 0, l.l, rstyle); l.l = 0; @@ -1971,7 +1971,7 @@ void rxvt_term::scr_refresh () NOTHROW { - unsigned char must_clear, /* use draw_string not draw_image_string */ + unsigned char have_bg, showcursor; /* show the cursor */ int16_t col, row, /* column/row we're processing */ ocrow; /* old cursor row */ @@ -1989,14 +1989,14 @@ /* * A: set up vars */ - must_clear = 0; + have_bg = 0; refresh_count = 0; #if XPM_BACKGROUND - must_clear |= bgPixmap.pixmap != None; + have_bg |= bgPixmap.pixmap != None; #endif #if TRANSPARENT - must_clear |= OPTION (Opt_transparent) && am_transparent; + have_bg |= OPTION (Opt_transparent) && am_transparent; #endif ocrow = oldcursor.row; /* is there an old outline cursor on screen? */ @@ -2105,9 +2105,10 @@ */ if (!display->is_local && refresh_type == FAST_REFRESH && num_scr_allow && num_scr - && abs (num_scr) < nrow && !must_clear) + && abs (num_scr) < nrow && !have_bg) { int16_t nits; + int i = num_scr; int j; int len, wlen; dLocal (int, num_scr); @@ -2115,6 +2116,7 @@ j = nrow; wlen = len = -1; row = i > 0 ? 0 : j - 1; + for (; j-- >= 0; row += (i > 0 ? 1 : -1)) { if (row + i >= 0 && row + i < nrow && row + i != ocrow) @@ -2145,17 +2147,22 @@ } } - if (len != -1) + if (len >= 0) { /* also comes here at end if needed because of >= above */ if (wlen < len) ::swap (wlen, len); + XGCValues gcv; + + gcv.graphics_exposures = 1; XChangeGC (dpy, gc, GCGraphicsExposures, &gcv); XCopyArea (dpy, vt, vt, gc, 0, Row2Pixel (len + i), (unsigned int)this->width, (unsigned int)Height2Pixel (wlen - len + 1), 0, Row2Pixel (len)); + gcv.graphics_exposures = 0; XChangeGC (dpy, gc, GCGraphicsExposures, &gcv); + len = -1; } } @@ -2221,14 +2228,14 @@ if (stp[col] != dtp[col] || !RS_SAME (srp[col], drp[col])) { - if (must_clear && (i++ > count / 2)) + if (have_bg && (i++ > count / 2)) break; dtp[col] = stp[col]; drp[col] = rend; i = 0; } - else if (must_clear || (stp[col] != ' ' && ++i >= 16)) + else if (have_bg || (stp[col] != ' ' && ++i >= 16)) break; } @@ -2248,24 +2255,6 @@ // only do special processing if any attributes are set, which is unlikely if (rend & (RS_Bold | RS_Italic | RS_Uline | RS_RVid | RS_Blink | RS_Careful)) { -#if ENABLE_STYLES - // "careful" (too wide) character handling - - // include previous careful character(s) if possible, looks nicer (best effort...) - while (text > stp - && srp[text - stp - 1] & RS_Careful - && RS_SAME (rend, srp[text - stp - 1])) - text--, count++, xpixel -= fwidth; - - // force redraw after "careful" characters to avoid pixel droppings - for (int i = 0; srp[col + i] & RS_Careful && col + i < ncol - 1; i++) - drp[col + i + 1] = srp[col + i + 1] ^ RS_redraw; - - // force redraw before "careful" characters to avoid pixel droppings - for (int i = 0; srp[text - stp - i] & RS_Careful && text - i > stp; i++) - drp[text - stp - i - 1] = srp[text - stp - i - 1] ^ RS_redraw; -#endif - bool invert = rend & RS_RVid; #ifndef NO_BOLD_UNDERLINE_REVERSE @@ -2291,18 +2280,29 @@ # endif } - if (rend & RS_Uline && ISSET_PIXCOLOR (Color_UL)) + if (rend & RS_Uline && fore == Color_fg && ISSET_PIXCOLOR (Color_UL)) fore = Color_UL; #endif if (invert) { - ::swap (fore, back); +#ifdef OPTION_HC + if ((showcursor && row == screen.cur.row && text - stp == screen.cur.col) + || !ISSET_PIXCOLOR (Color_HC)) +#endif + /* invert the column if no highlightColor is set or it is the + * current cursor column */ + ::swap (fore, back); +#ifdef OPTION_HC + else if (ISSET_PIXCOLOR (Color_HC)) + back = Color_HC; +#endif #ifndef NO_BOLD_UNDERLINE_REVERSE +# ifndef OPTION_HC if (ISSET_PIXCOLOR (Color_RV)) back = Color_RV; - +# endif if (fore == back) { fore = Color_bg; @@ -2323,6 +2323,24 @@ fore = back; } #endif + +#if ENABLE_STYLES + // "careful" (too wide) character handling + + // include previous careful character(s) if possible, looks nicer (best effort...) + while (text > stp + && srp[text - stp - 1] & RS_Careful + && RS_SAME (rend, srp[text - stp - 1])) + text--, count++, xpixel -= fwidth; + + // force redraw after "careful" characters to avoid pixel droppings + for (int i = 0; srp[col + i] & RS_Careful && col + i < ncol - 1; i++) + drp[col + i + 1] = srp[col + i + 1] ^ RS_redraw; + + // force redraw before "careful" characters to avoid pixel droppings + for (int i = 0; srp[text - stp - i] & RS_Careful && text - i > stp; i++) + drp[text - stp - i - 1] = srp[text - stp - i - 1] ^ RS_redraw; +#endif } /* @@ -2332,21 +2350,19 @@ if (back == fore) font->clear_rect (*drawable, xpixel, ypixel, fwidth * count, fheight, back); - else if (back == Color_bg) + else if (back == Color_bg && have_bg) { - if (must_clear) - { - CLEAR_CHARS (xpixel, ypixel, count); + // this is very ugly, maybe push it into ->draw? - for (i = 0; i < count; i++) /* don't draw empty strings */ - if (text[i] != ' ') - { - font->draw (*drawable, xpixel, ypixel, text, count, fore, -1); - break; - } - } - else - font->draw (*drawable, xpixel, ypixel, text, count, fore, Color_bg); + for (i = 0; i < count; i++) /* don't draw empty strings */ + if (text[i] != ' ') + { + font->draw (*drawable, xpixel, ypixel, text, count, fore, -1); + goto did_clear; + } + + CLEAR_CHARS (xpixel, ypixel, count); + did_clear: ; } else font->draw (*drawable, xpixel, ypixel, text, count, fore, back);