--- rxvt-unicode/src/screen.C 2006/02/17 14:30:51 1.259 +++ rxvt-unicode/src/screen.C 2006/02/20 22:42:01 1.262 @@ -1,4 +1,4 @@ -/*--------------------------------*-C-*--------------------------------------* +/*---------------------------------------------------------------------------* * File: screen.C *---------------------------------------------------------------------------* * @@ -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; } @@ -2332,21 +2339,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);