--- rxvt-unicode/src/screen.C 2008/11/04 23:08:44 1.319 +++ rxvt-unicode/src/screen.C 2008/11/05 12:28:15 1.325 @@ -280,6 +280,7 @@ { // Re-wrap lines. This is rather ugly, possibly because I am too dumb // to come up with a lean and mean algorithm. + // TODO: maybe optimise when width didn't change row_col_t ocur = screen.cur; ocur.row = MOD (term_start + ocur.row, prev_total_rows); @@ -436,6 +437,7 @@ { scr_release (); prev_nrow = prev_ncol = 0; + rvideo_mode = false; scr_soft_reset (); scr_reset (); @@ -451,8 +453,6 @@ scr_overlay_off (); #endif - rvideo_mode = false; - if (current_screen != PRIMARY) scr_swap_screen (); @@ -1343,36 +1343,43 @@ min_it (num, nrow - row); - /*TODO: the xlceararea/xfillrectangle below don't take scroll offste into account, ask mikachu for details */ + // TODO: the code below does not work when view_start != 0 + // the workaround is to disable the clear and use a normal refresh + // when view_start != 0. mysterious. if (rstyle & (RS_RVid | RS_Uline)) ren = (rend_t) ~RS_None; else if (GET_BASEBG (rstyle) == Color_bg) { ren = DEFAULT_RSTYLE; - if (mapped) + if (mapped && !view_start) XClearArea (dpy, vt, 0, - Row2Pixel (row), (unsigned int)width, + Row2Pixel (row - view_start), (unsigned int)width, (unsigned int)Height2Pixel (num), False); } else { ren = rstyle & (RS_fgMask | RS_bgMask); - gcvalue.foreground = pix_colors[bgcolor_of (rstyle)]; - XChangeGC (dpy, gc, GCForeground, &gcvalue); - XFillRectangle (dpy, vt, gc, - 0, Row2Pixel (row), - (unsigned int)width, - (unsigned int)Height2Pixel (num)); - gcvalue.foreground = pix_colors[Color_fg]; - XChangeGC (dpy, gc, GCForeground, &gcvalue); + if (mapped && !view_start) + { + gcvalue.foreground = pix_colors[bgcolor_of (rstyle)]; + XChangeGC (dpy, gc, GCForeground, &gcvalue); + XFillRectangle (dpy, vt, gc, + 0, Row2Pixel (row - view_start), + (unsigned int)width, + (unsigned int)Height2Pixel (num)); + gcvalue.foreground = pix_colors[Color_fg]; + XChangeGC (dpy, gc, GCForeground, &gcvalue); + } } for (; num--; row++) { scr_blank_screen_mem (ROW(row), rstyle); - scr_blank_line (drawn_buf [row], 0, ncol, ren); + + if (!view_start) + scr_blank_line (drawn_buf [row], 0, ncol, ren); } } @@ -1535,8 +1542,7 @@ line->r[col] = line->r[col + count]; } - scr_blank_line (*line, ncol - count, count, - line->r[ncol - 1] & (RS_fgMask | RS_bgMask | RS_baseattrMask)); + scr_blank_line (*line, ncol - count, count, rstyle); if (selection.op && current_screen == selection.screen && ROWCOL_IN_ROW_AT_OR_AFTER (selection.beg, screen.cur))