--- rxvt-unicode/src/screen.C 2010/07/26 09:57:53 1.346 +++ rxvt-unicode/src/screen.C 2010/10/15 20:52:15 1.352 @@ -146,6 +146,8 @@ rend_t rend = l.r[col] & ~RS_baseattrMask; rend = SET_FONT (rend, FONTSET (rend)->find_font (' ')); + l.touch (); + // found start, nuke do { l.t[col] = ' '; @@ -900,6 +902,22 @@ # endif #endif + rend_t rend = SET_FONT (rstyle, FONTSET (rstyle)->find_font (c)); + + // if the character doesn't fit into the remaining columns... + if (expect_false (screen.cur.col > ncol - width && ncol >= width)) + { + if (screen.flags & Screen_Autowrap) + { + // ... artificially enlargen the previous one + c = NOCHAR; + // and try the same character next loop iteration + --str; + } + else + screen.cur.col = ncol - width; + } + // nuke the character at this position, if required if (expect_false ( line->t[screen.cur.col] == NOCHAR @@ -908,17 +926,6 @@ )) scr_kill_char (*line, screen.cur.col); - rend_t rend = SET_FONT (rstyle, FONTSET (rstyle)->find_font (c)); - - // if the character doesn't fit into the remaining columns... - if (expect_false (screen.cur.col > ncol - width && ncol >= width)) - { - // ... artificially enlargen the previous one - c = NOCHAR; - // and try the same character next loop iteration - --str; - } - line->touch (); do @@ -933,7 +940,8 @@ line->l = ncol; if (screen.flags & Screen_Autowrap) screen.flags |= Screen_WrapNext; - break; + + goto end_of_line; } c = NOCHAR; @@ -941,16 +949,14 @@ while (expect_false (--width > 0)); // pad with spaces when overwriting wide character with smaller one - if (expect_false (!width)) + for (int c = screen.cur.col; expect_false (c < ncol && line->t[c] == NOCHAR); c++) { - line->touch (); - - for (int c = screen.cur.col; c < ncol && line->t[c] == NOCHAR; c++) - { - line->t[c] = ' '; - line->r[c] = rend; - } + line->t[c] = ' '; + line->r[c] = rend; } + +end_of_line: + ; } #if ENABLE_COMBINING else // width == 0 @@ -1023,6 +1029,8 @@ #endif } } + else if (screen.flags & Screen_WrapNext) + screen.flags &= ~Screen_WrapNext; else scr_gotorc (0, -1, RELATIVE); } @@ -1338,16 +1346,13 @@ min_it (num, nrow - row); - // 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_Blink | RS_RVid | RS_Uline)) ren = (rend_t) ~RS_None; else if (GET_BASEBG (rstyle) == Color_bg) { ren = DEFAULT_RSTYLE; - if (mapped && !view_start) + if (mapped) XClearArea (dpy, vt, 0, Row2Pixel (row - view_start), (unsigned int)width, (unsigned int)Height2Pixel (num), False); @@ -1356,7 +1361,7 @@ { ren = rstyle & (RS_fgMask | RS_bgMask); - if (mapped && !view_start) + if (mapped) { gcvalue.foreground = pix_colors[bgcolor_of (rstyle)]; XChangeGC (dpy, gc, GCForeground, &gcvalue); @@ -1373,8 +1378,8 @@ { scr_blank_screen_mem (ROW(row), rstyle); - if (!view_start) - scr_blank_line (drawn_buf [row], 0, ncol, ren); + if (row - view_start < nrow) + scr_blank_line (drawn_buf [row - view_start], 0, ncol, ren); } }